"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");
});
어떤방식으로 해결해야 할까요?