티스토리 뷰

[주소 문자열과 요청 파라미터 다루기]


- url 모듈을 이용해 주소 문자열을 객체로 만들면 문자열 안에 있던 각각의 정보를 나누어 그 객체의 속성으로 보관한다.

- https://www.asdf.com?query=actor

- protocol : "https"

- host : "www.asdf.com"

- query : "query=actor"

require('url')

- parse() : 주소 문자열을 파싱하여 URL 객체를 만들어줌

- format() : URL 객체를 주소 문자열로 변환


const url = require("url")
const curUrl = url.parse("http://www.asdf.com")
console.log(curUrl.protocol) //http:
console.log(curUrl.hostname) //www.asdf.com
console.log(curUrl)
/*
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.asdf.com',
port: null,
hostname: 'www.asdf.com',
hash: null,
search: null,
query: null,
pathname: '/',
path: '/',
href: 'http://www.asdf.com/' }
*/
const stringUrl = url.format(curUrl)
console.log(stringUrl) //http://www.asdf.com


- 요청 파라미터는 & 기호로 구분되는데, querystring 모듈을 사용하여 요청 파라미터를 쉽게 분리할 수 있다.

- require('querystring')

- parse() : 요청 파라미터 문자열을 파싱하여 요청 파라미터 객체로 만들어줌

- stringfy() : 요청 파라미터 객체를 문자열로 변환


const url = require("url")
const querystring = require("querystring")
const curUrl = url.parse("http://www.asdf.com?query=asdf&query2=fdas")
var param = querystring.parse(curUrl.query)
console.log(param) //{ query: 'asdf', query2: 'fdas' }
console.log(param.query) //asdf
console.log(param.query2) //fdas
console.log(querystring.stringify(param)) //query=asdf&query2=fdas


- querystring으로 파싱하면 주소 문자열의 ? 이후 부분이 분리되어 JSON 형태로 반환된다.

- 그러므로 각 요청 파라미터 값에 .으로 접근 가능하다.



[이벤트 이해하기]


- 노드는 대부분 이벤트를 기반으로 하는 비동기 방식으로 처리하며, 비동기 방식으로 처리하기 위해 서로 이벤트를 전달한다.

- EventEmitter 는 이벤트를 주고받는 방법을 제공한다.

- require('event').EventEmitter

- 노드의 객체는 EventEmitter 를 상속받을 수 있고, on(), emit() 메소드를 사용할 수 있다.


- on(event, listener) : 지정한 이벤트의 리스너 추가

- once(event, listener) : 지정한 이벤트의 리스너를 추가, 한 번 실행한 후에는 자동으로 리스너가 제거됨

- emit() : 이벤트를 다른 쪽으로 전달

- removeListener(event, listener) : 지정한 이벤트에 대한 리스너 제거


process.on("tick", function(count) {
console.log(count)
})
//틱 이벤트 등록
setTimeout(function() {
console.log("2초 후 틱 이벤트")
process.emit("tick", "2")
//틱 이벤트 전달
}, 2000)



var Calc = require("./calc")
var calc = new Calc()
calc.emit("stop")
console.log(Calc.title + "에 stop 이벤트 전달")


const util = require("util")
const eventEmitter = require("events").EventEmitter

var Calc = function() {
var self = this
this.on("stop", function() {
console.log("calc에 stop event 전달됨")
})
}
util.inherits(Calc, eventEmitter)
//Calc 객체가 EventEmitter를 상속받음

Calc.prototype.add = function(a, b) {
return a + b
}
module.exports = Calc
module.exports.title = "calculator"




[파일 다루기]


- 파일을 다루는 기능 / 디렉토리를 다루는 기능

- 동기 IO(Sync 단어가 붙음) / 비동기 IO

- require('fs')

- readFile(filename, [encoding], [callback]) : 비동기식 IO로 파일을 읽어들임

- readFileSync(filename, [encoding]) : 동기식 IO로 파일을 읽어들임

- writeFile(filename, data, encoding='utf8', [callback]) : 비동기식 IO로 파일을 씀

- writeFileSync(filename, data, encoding='utf8') : 동기식 IO로 파일을 씀


- 일반적으로 비동기 방식 메소드를 사용한다.


const fs = require("fs")
fs.writeFile("./asdf.txt", "jsadfjkl", "utf8", (err) => {
console.log(err)
})


const fs = require("fs")
const data = fs.readFile("./package.json", "utf8", (err, data) => {
console.log(data)
})
console.log("fdas")


- 에러가 없으면 err에 null이 들어감


- 위의 방식으로 쉽게 파일을 읽거나 쓸 수 있으나 실제로는 한꺼번에 모든 데이터를 읽거나 쓰지 않고 조금씩 읽거나 쓰는 방식을 사용할 수 있다.

- 다른 곳에서 받아 온 데이터를 파일에 쓰는 경우도 있다.


- open(path, flags [, mode] [, callback]) : 파일 엶

- read(fd, buffer, offset, length, position [, callback]) : 지정한 부분의 파일 내용을 읽음

- write(fd, buffer, offset, length, position [, callback]) : 파일의 지정한 부분에 데이터를 씀

- close(fd [, callback]) : 파일 닫음


const fs = require("fs")
fs.open("./output.txt", "w", (err, fd) => {
if(err) throw err
var buf = new Buffer("안녕!\n")
fs.write(fd, buf, 0, buf.length, (err, written, buffer) => {
if(err) throw err
console.log(err, written, buffer)
fs.close(fd, (err) => {
console.log("파일 열고 데이터 쓰고 파일 닫기 완료")
})
})
})


- 콜백 안에서 파일 디스크립터를 받고 Buffer 객체에 쓸 데이터를 저장하여 파일을 쓰는 모습이다. 콜백에 콜백이 꼬리를 문다...


const fs = require("fs")
fs.open("./output.txt", "r", (err, fd) => {
if(err) throw err
var buf = new Buffer(10)
fs.read(fd, buf, 0, buf.length, null, (err, bytesRead, buffer) => {
if(err) throw err
var string = buffer.toString("utf8", 0, bytesRead)
console.log(string)
console.log(err, bytesRead, buffer)
fs.close(fd, (err) => {
console.log("output.txt 열고 읽기 완료")
})
})
})


- Buffer 객체는 바이너리 데이터를 읽고 쓰는 데 사용한다.

- Buffer 인스턴스를 만들 때 크기를 지정한 후 문자열을 쓰는 방식으로 만들 수도 있고, 문자열을 매개변수로 넘겨 만들 수도 있다.

- copy(), concat() 사용 가능


- 데이터 단위가 아닌 스트림 단위로 파일을 읽거나 쓸 수 있다.

- createReadStream(path [, options]) : 파일을 읽기 위한 스트림 객체 만듦

- createWriteStream(path [, options]) : 파일을 쓰기 위한 스트림 객체 만듦



[로그 파일 남기기]


- winston 외부 모듈을 사용하여 로그를 보관할 수 있음





댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함