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

rmatlr0112님의 프로필 이미지
rmatlr0112

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

시퀄라이즈 사용하기

시퀄라이즈 연결질문...

해결된 질문

작성

·

417

0

require('dotenv').config();
const PORT = process.env.PORT;
const dotenv = require('dotenv');
const express = require('express');
const compression = require("compression");
const methodOverride = require("method-override");
const cors  = require("cors");
const userRouter = require("./routes/userRoute");
const boardRouter = require("./routes/boardRoute");
const authRouter = require('./routes/auth'); // 인증 라우터
const ejsMate = require('ejs-mate');
const path = require('path');
const session = require('express-session');
const morgan = require('morgan');
const nunjucks = require('nunjucks');
const passport = require('passport');
const passportConfig = require('./passport');
const { sequelize } = require('../models/index');
const cookieParser = require('cookie-parser');
const app = express();

passportConfig();


nunjucks.configure('views', {
    express : app,
    watch : true,
});

sequelize.sync({ force: true })
    .then(() => {
        console.log("데이터 베이스 연결 성공")
    })
    .catch((err) => {
        console.log(err);
    });




app.engine('ejs', ejsMate)
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'))

app.use(express.urlencoded({ extended: true }));
app.use(compression());
app.use(express.json());
app.use(express.urlencoded({extended:true}));
app.use(methodOverride());
app.use(cors());
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(
   session({
      resave: false,
      saveUninitialized: false,
      secret: process.env.COOKIE_SECRET,
      cookie: {
         httpOnly: true,
         secure: false,
      },
   }),
);
//! express-session에 의존하므로 뒤에 위치해야 함
app.use(passport.initialize()); // 요청 객체에 passport 설정을 심음
app.use(passport.session()); // req.session 객체에 passport정보를 추가 저장
// passport.session()이 실행되면, 세션쿠키 정보를 바탕으로 해서 passport/index.js의 deserializeUser()가 실행하게 한다.
 


app.use('/', userRouter);
app.use('/', boardRouter);
app.use('/auth', authRouter);






app.get('/', (req,res)=>{
    res.render('home')
})






app.listen(PORT, () => {
    console.log(`SERVING ON THE ${PORT}`);
})

module.exports = app;

<env파일>

DB_HOST = localhost

DB_USER = root

DB_PASS = tkfkdgo12

DB_NAME = nodejs

PORT = 3000

JWT_SECRET = softsquared_jwt_secret_key_07040014087

COOKIE_SECRET = cookiesecret

KAKAO_ID = bcb213727449d2b53039dcca5f541c02

const Sequelize = require('sequelize'); const path = require('path'); const env = process.env.NODE_ENV || 'development'; const User = require('./user'); // config/config.json 파일에 있는 설정값들을 불러온다. // config객체의 env변수(development)키 의 객체값들을 불러온다. // 즉, 데이터베이스 설정을 불러온다고 말할 수 있다. const config = require('../config/config')[env] const db = {}; // new Sequelize를 통해 MySQL 연결 객체를 생성한다. const sequelize = new Sequelize(config.database, config.username, config.password, config) // 연결객체를 나중에 재사용하기 위해 db.sequelize에 넣어둔다. db.Sequelize = Sequelize; db.sequelize = sequelize; User.init(sequelize); // 모듈로 꺼낸다. module.exports = db;

 

 

<models 폴더 내 index.js>

const Sequelize = require('sequelize');
const path = require('path');
const env = process.env.NODE_ENV || 'development';
const User = require('./user');

// config/config.json 파일에 있는 설정값들을 불러온다.
// config객체의 env변수(development)키 의 객체값들을 불러온다.
// 즉, 데이터베이스 설정을 불러온다고 말할 수 있다.
const config = require('../config/config')[env]
 
const db = {};
 
// new Sequelize를 통해 MySQL 연결 객체를 생성한다.
const sequelize = new Sequelize(config.database, config.username, config.password, config)
 
// 연결객체를 나중에 재사용하기 위해 db.sequelize에 넣어둔다.
db.Sequelize = Sequelize;
db.sequelize = sequelize;
User.init(sequelize);

// 모듈로 꺼낸다.
module.exports = db;

 

 

<config.json>{ "development": { "username": "root", "password": "tkfkdgo12", "database": "nodejs", "host": "localhost", "dialect": "mysql" }, "test": { "username": "root", "password": null, "database": "database_test", "host": "127.0.0.1", "dialect": "mysql" }, "production": { "username": "root", "password": null, "database": "database_production", "host": "127.0.0.1", "dialect": "mysql" } }

 

<오류메시지>

비밀번호 설정도 다해줬는데 모르겠습니다 ㅠㅠ

스크린샷 2022-11-27 오후 9.42.17.png

 

답변 2

0

강의대로 따라서 코드 작성 후 npm start로 실행하니

 

sequelize.sync({force:false})

^

TypeError: sequelize.sync is not a function

[nodemon] app crashed - waiting for file changes before starting...

라고 뜹니다 ㅜ

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

require 부분을 빠뜨리신것 같습니다.

require도 문제 없어서 다시 천천히 보니

db.sequelize = sequelize; 를

대문자로 db.sequelize = Sequelize; 로 적어서 오류났네요

답글 달아주셔서 감사합니다

 

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

혹시 config.json 말고 config.js도 있나요? process.env.NODE_ENV도 콘솔로그 찍어보세요.

rmatlr0112님의 프로필 이미지
rmatlr0112
질문자

config.js 는 없는데, 이것과는 별개로 그전에 database Nodejs랑 연결한답시고 config 폴더 내 database.js 파일을 만들어서

아래와 같은 코드 입력하고 데이터베이스를 연결해준 이력이 있는데 이것과 충돌이 일어나는걸까요?

require("dotenv").config();
const mysql = require("mysql2/promise");



const config = 
{
    host: `${process.env.DB_HOST}`,
    user:`${process.env.DB_USER}`,
    port: `3306`,
    password: `${process.env.DB_PASS}`,
    database: `${process.env.DB_NAME}`
}

const pool = mysql.createPool(config);

module.exports = pool;
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

가장 확실한 건 model/index.js에서 console.log(config) 해보세요

rmatlr0112님의 프로필 이미지
rmatlr0112
질문자

const Sequelize = require('sequelize');
const path = require('path');
const env = process.env.NODE_ENV || 'development';
const User = require('./user');

// config/config.json 파일에 있는 설정값들을 불러온다.
// config객체의 env변수(development)키 의 객체값들을 불러온다.
// 즉, 데이터베이스 설정을 불러온다고 말할 수 있다.
const config = require('../config/config')[env]
console.log(config);
const db = {};
 
// new Sequelize를 통해 MySQL 연결 객체를 생성한다.
const sequelize = new Sequelize(config.database, config.username, config.password, config)
 
// 연결객체를 나중에 재사용하기 위해 db.sequelize에 넣어둔다.
db.Sequelize = Sequelize;
db.sequelize = sequelize;
User.init(sequelize);


// 모듈로 꺼낸다.
module.exports = db;

이렇게 console.log(config) 해줫는데 같은 오류만 나옵니다 ㅠㅠ

 

스크린샷 2022-11-28 오전 12.12.24.png

rmatlr0112님의 프로필 이미지
rmatlr0112
질문자

엇,,,혹시 몰라서 위에서 말씀드린 database.js 에 console.log(config)하니깐 얘에서는 찍히는데 그럼 얘가 먼저 선수?치고있어서 시퀄라이즈가 연결을 못시킨다고 봐야할까요?

rmatlr0112님의 프로필 이미지
rmatlr0112
질문자

스크린샷 2022-11-28 오전 12.19.36.png

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네 그런 듯 합니다.

rmatlr0112님의 프로필 이미지
rmatlr0112
질문자

아 그러면,, 시퀄라이즈를 쓰는거면 다음과 같이 데이터베이스 연결시켜주는 코드가 필요없게 되는걸까요? 어차피 시퀄라이즈 자체가 데이터베이스와 연동되니깐요 ?


const pool = mysql.createPool(config);
module.exports = pool;

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네 필요없습니다. 시퀄라이즈에서 알아서 연결 맺습니다.

rmatlr0112님의 프로필 이미지
rmatlr0112
질문자

으앗,,또 하나 배웠네요 감사합니다 제로초님 짱짱맨!!

rmatlr0112님의 프로필 이미지
rmatlr0112

작성한 질문수

질문하기