NodeJS
[Node.js] sequelize 연관된 데이터 합쳐서 불러오기 / attributes, include
jinist
2022. 3. 20. 20:32
로그인 시 DB에서 유저의 ID를 조회하여
유저의 정보를 전달 해주었는데
유저의 데이터는 사용자의 입력으로 생성된 email, nickname, password뿐이며
이 정보만 전달해서 보낼 경우 유저가 올린 게시글 정보 등 연관된 데이터는 알 수가 없다.
또한, password는 프론트로 보내서 state에 저장할 필요가 없다.
즉, front에 데이터를 보내기 전에
뺄 건 빼고 추가할 건 추가해서 보내주어야 한다.
const userData = await User.findOne({
where: { id: user.id },
attributes: {
exclude: ["password"], // user데이터에서 password만 빼고 가져오기
},
include: [
// 추가로 포함시킬 데이터, as를 사용했을 경우 as정보도 입력해주어야 한다.
{ model: db.Post },
], // Post
});
return res.status(200).json(userData);
});
특정 column 가져오기
attributes: ["가지고오고싶은 column이름", "...", "..."]
특정 column을 제외해서 가져오기
attributes: {
exclude: ["제외할 column 이름"]
}
include를 사용하면 이전에 관계설정을 해놓은 대로 가져와지는데
db.User.hasMany(db.Post);으로 연결시켜 놓은
Post를 가지고온다.
login router 코드
router.post(
"/login",
(req, res, next) => {
passport.authenticate("local", (err, user, info) => {
if (err) {
console.log(error);
return next(error);
}
if (info) {
return res.status(401).send(info.reason);
}
return req.login(user, async (loginErr) => {
if (loginErr) {
console.log(loginErr);
return next(loginErr);
}
const userData = await User.findOne({
where: { id: user.id },
attributes: {
exclude: ["password"],
},
include: [
{ model: db.Post },
],
});
return res.status(200).json(userData);
});
})(req, res, next);
}
);