mongoose
는 MongoDB에 데이터를 쉽게 읽고 쓰게 해주는 JavaScript 라이브러리.
ODM(Object Document Mapper)이라고도 부릅니다.
yarn add mongoose
#document
{
"_id": ObjectId("6682192a1c155bd2f27881"),
"name": "lyw",
}
const UsersSchema = new mongoose.Schema({
name: String, // 문자열 타입입니다.
age: Number, // 숫자 타입입니다.
favorites: [String], // 문자열 배열 타입입니다.
createdAt: { type: Date, default: Date.now }, // 날짜 타입입니다.
someId: mongoose.Schema.Types.ObjectId // ObjectId 타입입니다.
});
대표적인 스키마 타입
null
: null 값과 존재하지 않는 필드
- e.g: null
String
: 문자열
- e.g: "mongoDB"
Number
: 숫자
- e.g: 3.14
Date
: 날짜
- e.g: new Date()
Buffer
: 파일을 담을 수 있는 버퍼, UTF-8이 아닌 문자열 저장
- e.g: 0x65
Boolean
:true
orfalse
- e.g: true
ObjectID
(Schema.Types.ObjectID): 객체 ID, 주로 다른 객체를 참조할 때 넣음
- e.g: ObjectID()
Array
: 배열 형태의 값
- e.g: ["a","b","c"]
웹 서버에서 요청을 받을 때, 모든 요청에 대한 공통적인 처리를 하고 싶을 때 필요한 것이 미들웨어
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
urlencoded
: form-rulencoded
라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수있게 도와준다.json
: JSON
이라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와준다.app.use((req, res, next) => {
// 필요한 코드
});
req
: 요청에 대한 정보가 담겨있는 객체res
: 응답을 위한 기능 제공next
: 다음 스택으로 정의된 미들웨어를 호출//로그를 남기는 미들웨어
app.use((req, res, next) => {
console.log('Request URL:', req.originalUrl, ' - ', new Date());
next();
});
app.use((req, res, next) => {
console.log('첫번째 미들웨어');
next();
});
app.use((req, res, next) => {
console.log('두번째 미들웨어');
next();
});
app.use((req, res, next) => {
console.log('세번째 미들웨어');
next();
});
// print: 첫번째 미들웨어
// print: 두번째 미들웨어
// print: 세번째 미들웨어
next()
가 실행되지 않으면 다음 미들웨어는 실행되지 않고, 클라이언트의 요청은 종료된다.res.send()
나 res.json()
등의 메서드를 호출하는 경우에는 next()
를 호출하면 안 된다. 이미 요청이 종료된 상태에서 다른 미들웨어가 응답을 보내려고 하여 중복된 요청이 전달되는 문제가 발생한다.app.use(Middleware)
: 모든 요청에서 미들웨어가 실행된다.app.use('/api', Middleware)
: /api로 시작하는 모든 요청에서 미들웨어를 실행한다.app.post('/api', Middleware, (req,res,) => {})
: /api로 시작하는 POST
요청에서 미들웨어를 실행한다.JS 유효성 검증을 위한 라이브러리. 여러 타입과 규칙을 이용해 유효성을 검증할 수 있다. 유효성 검증에 실패하면 오류를 발생시킨다.
# yarn을 이용해 Joi를 설치합니다.
yarn add joi
import Joi from 'joi';
// Joi 스키마를 정의합니다.
const schema = Joi.object({
// name Key는 문자열 타입이고, 필수로 존재해야합니다.
// 문자열은 최소 3글자, 최대 30글자로 정의합니다.
name: Joi.string().min(3).max(30).required(),
});
// 검증할 데이터를 정의합니다.
const user = { name: 'Foo Bar' };
// schema를 이용해 user 데이터를 검증합니다.
const validation = schema.validate(user);
// 검증 결과값 중 error가 존재한다면 에러 메시지를 출력합니다.
if (validation.error) {
console.log(validation.error.message);
} else {
// 검증 결과값 중 error가 존재하지 않는다면, 데이터가 유효하다는 메시지를 출력합니다.
console.log('Valid Data!');
}
name
속성이 문자열인지 검증하고, 3~30 글자 사이인지 검증한다.import Joi from 'joi';
// Joi 스키마를 정의합니다.
const schema = Joi.object({
// name Key는 문자열 타입이고, 필수로 존재해야합니다.
// 문자열은 이메일 형식에 맞아야합니다.
email: Joi.string().email().required(),
});
// 검증할 데이터를 정의합니다.
const user = { email: 'foo@example.com' };
// schema를 이용해 user 데이터를 검증합니다.
const validation = schema.validate(user);
// 검증 결과값 중 error가 존재한다면 에러 메시지를 출력합니다.
if (validation.error) {
console.log(validation.error.message);
} else {
// 검증 결과값 중 error가 존재하지 않는다면, 데이터가 유효하다는 메시지를 출력합니다.
console.log('Valid Email User!');
}
email
속성이 문자열이고, 이메일 형식인지 검증한다.import Joi from 'joi';
// Joi 스키마를 정의합니다.
const schema = Joi.object({
// name Key는 문자열 타입이고, 필수로 존재해야합니다.
// 문자열은 최소 3글자, 최대 30글자로 정의합니다.
name: Joi.string().min(3).max(30).required(),
});
// 검증할 데이터를 정의합니다.
const user = { name: 'Foo Bar' };
try {
// schema를 이용해 user 데이터를 검증합니다.
const validation = await schema.validateAsync(user);
// 검증 결과값 중 error가 존재하지 않는다면, 데이터가 유효하다는 메시지를 출력합니다.
console.log('Valid Data!');
} catch (error) {
// 검증에 실패한다면, 에러 메시지를 출력합니다.
console.log(error.message);
}
validate()
-> validateAsync()
로 변경하여 데이터를 비동기적으로 검증try/catch
구문 사용app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
err, req, res, next
는 각각 에러, 요청, 응답, 다음 미들웨어를 호출하는 함수이다.err
은 이전 미들웨어에서 발생한 에러를 전달받은 객체req, res
는 HTTP 요청과 응답을 관리하는 객체next
는 다음 미들웨어를 실행하는 함수Express.js에서는 미들웨어나 라우터에서 에러가 발생하면, 해당 에러를
next
함수를 통해 다음 미들웨어로 전달한다. 그리고 등록된 미들웨어 중 에러를 매개변수로 받는 미들웨어를 찾아 실행한다.