인프런 커뮤니티 질문&답변

신민규님의 프로필 이미지
신민규

작성한 질문수

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

노드버드 7장 오류 질문드립니다

작성

·

495

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

 

 

이런 오류가 뜨는데 왜 뜨는지 모르겠습니다.. 검색해도 답이 나오지 않길래 질문드립니다

답변 1

신민규님의 프로필 이미지
신민규
질문자

아차 싶네요.... 감사합니다!

 

신민규님의 프로필 이미지
신민규

작성한 질문수

질문하기