23.07.05 13:20 작성
·
485
0
app.js
const express = require("express");
const cookieParser = require("cookie-parser");
const morgan = require("morgan");
const path = require("path");
const session = require("express-session");
const nunjucks = require("nunjucks");
const dotenv = require("dotenv");
const { sequelize } = require("./models");
dotenv.config();
const pageRouter = require("./routes/page");
const app = express();
app.set("port", process.env.PORT || 8001);
app.set("view engine", "html");
nunjucks.configure("views", {
express: app,
watch: true,
});
//force:true로 할 시 서버 재시작시 모든 데이터베이스 날리고 다시 시작, true는 개발용
sequelize
.sync()
.then(() => {
console.log("데이터베이스 연결 성공");
})
.catch((err) => {
console.error(err);
});
app.use(morgan("dev"));
app.use(express.static(path.join(__dirname, "public")));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(
session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
})
);
app.use("/", pageRouter);
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} no exist router.`);
error.status = 404;
next(error);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== "production" ? err : {};
res.status(err.status || 500);
res.render("error");
});
app.listen(app.get("port"), () => {
console.log(app.get("port"), "waiting at the empty port.");
});
index.js
const Sequelize = require("sequelize");
const fs = require("fs");
const path = require("path");
const env = process.env.NODE_ENV || "development";
const config = require("../config/config.json")[env]; //설정 불러오기
const db = {};
const sequelize = new Sequelize( //불러온 설정을 시퀄라이즈와 연결하는 부분
config.database,
config.username,
config.password,
config
);
const basename = path.basename(__filename); //index.js
fs.readdirSync(__dirname)
.filter((file) => {
return (
file.indexOf(".") !== 0 && // .으로 시작하는 파일은 숨김 파일이라는 의미 그래서 제외
file !== basename && //현재 파일인 index.js는 제외
file.slice(-3) === ".js" //마무리로 확장자가 .js인 파일만 불러오기
);
})
.forEach((file) => {
const model = require(path.join(__dirname, file));
console.log(file, model.name);
db[model.name] = model; //model.name은 model파일에서 class의 이름과 동일함
model.initiate(sequelize);
});
Object.keys(db).forEach((modelName) => {
//위에서 initiate할 때 같이 associate까지 하면 되지 않냐라고 할 수 있지만 associate는 모든 파일을 initiate해주고 해야함
console.log(db.modelName);
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
module.exports = db; //시퀄라이즈와 그의 모델들은 자주 사용하니까 서로 묵어서 exports 해줌 언제어디서든 쓸 수 있게
.sync()
^
TypeError: Cannot read properties of undefined (reading 'sync')
at Object.<anonymous> (C:\Users\zzan9\OneDrive - dgu.ac.kr\nodejs\nodebirdSNS2\app.js:22:6)
at Module._compile (node:internal/modules/cjs/loader:1267:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1321:10)
at Module.load (node:internal/modules/cjs/loader:1125:32)
at Module._load (node:internal/modules/cjs/loader:965:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
at node:internal/main/run_main_module:23:47
Node.js v20.1.0
이런 오류가 뜨는데 왜 뜨는지 모르겠습니다.. 검색해도 답이 나오지 않길래 질문드립니다
2023. 07. 05. 15:27
아차 싶네요.... 감사합니다!