1. 미들웨어
미들웨어란?
- 미들웨어 함수는 req(요청) 객체, res(응답) 객체, 그리고 어플리케이션 요청-응답 사이클 도중 그 다음의 미들웨어 함수에 대한 엑세스 권한을 갖는다.
- 즉, 미들웨어란 클라이언트에서 요청을 받고 응답을 처리하기 전 중간에 목적에 맞게 처리를 하는 함수라고 생각하면 된다.
- 그래서 next()라는 함수가 꼭 필요하다. 미들웨어에서 처리를 하고 그 다음 실제 요청을 받는 함수로 넘어가기 위해서는 next() 함수를 사용해야 한다.
- 예를 들어, 요청이 들어오면 각 요청마다 필요한 로그 같은 것을 응답을 처리하기 전에 중복을 방지하기 위해 미들웨어로 출력한다.(passport, oauth)
미들웨어 예시
// 미들웨어 : 요청이 와서 응답을 하기 전에 들르는 곳
// logger로 req에 reqtime을 넣어줌
// 요청이 들어오면 log를 찍게됨
const moment = require("moment");
const logger = (req, res, next) => {
req.reqtime = moment().format("YYYY-MM-DD HH:mm:ss.sss");
console.log(`============> [${req.reqtime}][${req.method}${req.url} call!]`);
// 콘솔창에 색상을 변경해주는 이스케이브 문자를 추가해보자(마지막엔 원래 상태로)
console.log(
"\x1b[32m%s",
`===========> [${req.reqtime}][${req.method}]${req.url} call!`,
"\x1b[37m"
);
// req.query나 req.body로 데이터가 있을 때 log로 출력해줌
req.query &&
Object.keys(req.query).length &&
console.log(` ====> request query = `, req.query);
req.body &&
Object.keys(req.body).length &&
console.log(` ====> request body = `, req.body);
// 미들웨어를 거치고 그 다음 실제 api로 호출하기 위해 반드시 있어야 됨
next();
};
app.use(logger);
const api = require("./src/api/index");
app.use("/api", api);
const http = require("http").createServer(app);
http.listen(8080, () => {
console.log("server listen start : 8080");
});
- 위처럼 실제 요청을 받는 파일로 가기 전에 미들웨어를 선언해준다.
- req, res, next를 매개변수를 갖고 있는 함수를 선언하는데 그 때 req에 들어있는 정보들을 console로 출력해준다.
- 어떤 방식으로, 어떤 url 요청인지 등 원하는 것을 console로 응답을 해주기 전에 출력을 해줄 수 있다.
- 그 뿐만 아니라 요청에서 넘어오는 값(query, body)이 있다면 그 값들도 console로 출력 해줄 수 있다.
- 마지막에 실제 요청을 받는 곳으로 가기 위해 next()를 해줘야 한다.
- 미들웨어를 설정했으면 app.use()를 이용해 미들웨어를 사용하면 된다.
- 그럼 요청이 들어오게 되면 미들웨어를 들러 console를 출력하고 응답을 하게 된다.
2. MySQL DB연결(순수 쿼리문)
연결 방법 및 순서
- Mysql 모듈 설치
- npm i mysql; - Mysql 모듈 설치 연동
- const mysql = require('mysql'); - Mysql 접속 설정 정보
- const conn = {
host: '127.0.0.1',
port: '3306',
user: 'root',
password: '1234qwer',
database: 'facebook'
}; - Mysql 모듈 기본 사용법
// 1. DB 커넥션 생성
let connection = mysql.createConnection(conn);
// 2. DB 접속 시작
connection.connect();
// 3. DB 쿼리 작성(추가, 수정, 삭제 등)
connection.query('쿼리문', 콜백함수);
// 4. DB 접속 종료
connection.end();
연결 예시 및 사용
const mysql = require("mysql");
const conn = {
host: "127.0.0.1",
port: "3310",
user: "root",
password: "1234qwer",
database: "facebook",
};
const Maria = {};
Maria["findUser"] = (params) => {
return new Promise((resolve, reject) => {
// 1. DB 커넥션 생성
const connection = mysql.createConnection(conn);
// 2. DB 접속 시작
connection.connect();
// 3. DB 쿼리(사용자 검색)
const { userid, password } = params;
const sql =
"select * from users where " +
`userid="${userid}" and password="${password}";`;
console.log(sql);
connection.query(sql, (err, results) => {
if (err) {
console.trace(err);
reject();
} else {
// 4. DB 연결 종료
connection.end();
resolve(results);
}
});
});
};
module.exports = Maria;
- Maria라는 모듈에 하나씩 추가해서 사용하는 것인데 findUser라는 것을 추가해서 사용
- 프로미스를 생성하고 return 하는 함수를 사용
- 먼저 위에서 DB 설정을 한 conn을 이용해 DB 커넥션을 생성하고 DB 접속을 시작한다.
- connection.query(쿼리문, 콜백함수)로 err는 에러, result 성공했을 때 결과를 받아온다.
- console로 결과를 반환하고 err이면 reject()로 반환하고 성공이면 resolve(result)로 결과를 반환한다.
- 그 다음 DB를 종료시켜준다.
// /api/login POST 데이터를 전달 받는다.
router.post("/login", async (req, res) => {
const { userid, password } = req.body;
const results = await mysql.findUser(req.body);
console.log(results);
if (results && results.length > 0) {
res.send({ result: "success" });
} else {
res.send({ result: "fail" });
}
});
- 실제 서버에서 mysql을 연결하고 설정한 것을 require을 받아 추가한 findUser를 실행시키는데 await와 async를 사용한다.
- 반환한 promise 앞에 await를 붙이고 await를 붙인 위 함수에 async를 붙여주면 된다.
- 미들웨어로 인해 위에 3줄이 출력이 되었다.
- mysql을 설정하는 파일에 있는 connection.query에서 나온 결과를 콘솔에 찍는 것과 콜백함수를 실행시키는 과정에서 콘솔에 결과를 찍는 것 두개가 콘솔에 결과로 나온다.
'FrontEnd > Node.js' 카테고리의 다른 글
[Node] Sequelize 사용과 DB 연결, 회원가입 예시 (0) | 2022.12.17 |
---|---|
[Node] Project - Header, Home (0) | 2022.12.06 |
[Node] Project - Identify, DeleteUser (0) | 2022.12.03 |
[Node] Project - Login, Regist (0) | 2022.12.01 |
[Node] Project 구성 (0) | 2022.12.01 |