혼자 적어보는 노트

[Node.js] sequelize 연관된 데이터 합쳐서 불러오기 / attributes, include 본문

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);
  }
);
Comments