• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

sequelize Cannot read property 'findOne' of undefined 에러 입니다.

20.03.10 14:43 작성 조회수 794

0

"sequelize": "^5.21.5",
"sequelize-cli": "^5.5.1"

현재 시퀄라이즈 위 버전을 사용하고 있고,

댓글을 입력하고, post 요청을 보냈는데 아래와 같은 에러가 나옵니다.

1. 프론트에서 데이터 요청은 정상적으로 서버에 보냈습니다.

2.  아래와 같은 에러가 나옵니다.

TypeError: Cannot read property 'findOne' of undefined
   at router.post (/Users/kim/Desktop/projects/nodebird/back/routes/post.js:112:38)

다른 질문들에 남기신 답글들을 찾아보았는데,  model/ index.js 파일은 문제가 없는 것 같습니다.

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require("../config/config")[env];
const db = {};

const sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);

db.Comment = require("./comment")(sequelize, Sequelize);
db.Hashtag = require("./hashtag")(sequelize, Sequelize);
db.Image = require("./image")(sequelize, Sequelize);
db.Post = require("./post")(sequelize, Sequelize);
db.User = require("./user")(sequelize, Sequelize);

Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db); // associate -> 서로 테이블간의 관계를 만듬
}
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

댓글 등록하는 라우터 코드입니다.

router.post("/:id/comment", async (req, res, next) => {
try {
if (!req.user) {
return res.status(401).send("로그인이 필요합니다.");
}
const post = await db.Post.findOne({
where: {
id: req.params.id
}
});
if (!post) {
return res.status(404).send("포스트가 존재하지 않습니다.");
}
const newComment = await db.Comment.create({
PostId: post.id,
UserId: req.user.id,
content: req.body.content
});
await post.addComment(newComment.id);
const comment = await db.comment.findOne({
where: {
id: newComment.id
},
include: [
{
model: db.User,
attributes: ["id", "nickname"]
}
]
});
return res.json(comment);
} catch (e) {
console.error(e);
next(e);
}
});

서버부분 index.js 입니다.

const express = require("express");
const app = express();
const morgan = require("morgan");
const db = require("./models");
const cors = require("cors");
const cookieParser = require("cookie-parser");
const expressSession = require("express-session");
const dotenv = require("dotenv"); // dotdev 모듈을 불러와서
const passport = require("passport");
const passportConfig = require("./passport");

dotenv.config(); // 실행
db.sequelize.sync();
// api란, 다른 서비스가 내 서비스 기능을 실행할 수 있게 열어놓은 창구

passportConfig(); // passport index에서 보내주는 함수를 실행

app.use(
cors({
origin: true, //"http://localhost:3000" 로도 가능, 단 서버 재실행 하기
credentials: true
})
); // cors 미들웨어 장착
app.use(cookieParser("nodebirdcookie"));
app.use(
expressSession({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET, // 쿠키에 대한 암호화, parser에도 입력해줘야함.
cookie: {
httpOnly: true, // 자바스크립트에서 쿠키에 접근을 못함. 해커들이 남의 사이트에 심어서 쿠키 빼돌리는걸 방지
secure: false // https 를 사용한다면 true로 변경
},
name: "rnbck" // cookie에 설정할 이름을 담아줌, 보안을 위해서
})
);
app.use(passport.initialize());
app.use(passport.session());
app.use(morgan("dev")); // 로그 남기기 위함
app.use(express.json()); // json 형식의 본문을 처리
app.use(express.urlencoded({ extended: true })); // 폼으로 넘어오는 데이터를 처리하는 것

const userAPIRouter = require("./routes/user");
const postAPIRouter = require("./routes/post");
const postsAPIRouter = require("./routes/posts");
const hashtagAPIRouter = require("./routes/hashtag");
app.use("/api/user", userAPIRouter);
app.use("/api/post", postAPIRouter);
app.use("/api/posts", postsAPIRouter);
app.use("/api/hashtag", hashtagAPIRouter);

app.listen(3065, () => {
console.log("server is running on http://localhost:3065");
});

어떤방식으로 해결해야 할까요?

답변 2

·

답변을 작성해보세요.

0

꿈나무님의 프로필

꿈나무

질문자

2020.03.10

오타가 있었습니다. 해결 했습니다. 감사합니다!

0

db.Post나 db.Comment가 undefined입니다. console.log(db) 해보세요.