• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

우분투 환경에서 sequelize문제입니다.

20.09.21 18:43 작성 조회수 292

0

안녕하세요~ 

우분투 환경에서 api 서버와 db연동을 위해 강의에서 하시던대로 mysql 8버전을 설치후 테이블명이 다 대문자로 생성되어서 

db를 drop시키고 다시 reload all했으나 재생성이 되지 않았습니다. 

npx sequelize db:create로 만들면 테이블명이 무조건 대문자로만 만들어집니다.ㅠㅠ

다시 drop시키고 npx pm2 reload all로 재실행하여도 db가 생성이 되지 않는데 이유가 무엇일까요?..

db가 있으면 그냥 넘어가고 없으면 생성하는 걸로 알고있었는데 맞나요?

const express = require("express");
const cors = require("cors");
const session = require("express-session");
const cookieParser = require("cookie-parser");
const postRouter = require("./routes/post");
const postsRouter = require("./routes/posts");
const userRouter = require("./routes/user");
// models/index.js에서 model이 등록된 sequelize를 가져옴
const db = require("./models/index.js");
const passport = require("passport");
const passportConfig = require("./passport");
const dotenv = require("dotenv");
const morgan = require("morgan");
const path = require("path");
const hpp = require("hpp");
const helmet = require("helmet");

dotenv.config();
const app = express();
//sequelize.sync() =>  Promise기반 함수
db.sequelize
  .sync()
  .then(() => {
    console.log("db 연결 성공!");
  })
  .catch(console.error);

passportConfig();

if (process.env.NODE_ENV === "production") {
  app.use(morgan("combined")); // 자세한 로그( 접속자의 ip도 나옴 )
  app.use(hpp());
  app.use(helmet());
  app.use(
    cors({
      origin: "http://sonteve.kr",
      credentials: true,
    })
  );
} else {
  app.use(morgan("dev")); // 개발모드에서만 로그 찍어줌 (디버깅 편함)
  app.use(
    cors({
      // credentials : true일때는 모든도메인허용불가하므로 정확한 도메인을 적어주어야한다. 또는 origin: true 로 해준다.
      origin: true, // 모든 도메인으로 부터의 요청 허용 (도메인이 다르면 cors에러가남.) 프론트를 3060 백은 3065이기때문
      credentials: true, // 도메인이 다르면 쿠키가 전달이 안되는데 쿠키를 보내려면 credentails를 true로 해줘야함.
      // front에서는 axios요청의 세번째 인자로 { withCredentials: true} 를 넣어줘야 쿠키가 동봉된다.
    })
  );
}

// 프론트에서 body에 보내온 데이터를 해석해준다.
// 라우터에 걸리면 미들웨어가 종료되기때문에 상단에 위치시켜준다.

//  app.use("/", express.static(path.join(__dirname, "uploads")));  => localhost:3065/이미지파일.png (프론트에서 서버쪽 폴더구조 모르게할 수 있다.)
app.use("/", express.static(path.join(__dirname, "uploads"))); // __dirname(back)과 uploads경로를 합쳐준다. 운영체제 마다 경로가 차이나기때문에 path.join을쓴다.
app.use(express.json()); // json으로 넘어오는 데이터를 해석 해서  req.body에 넣어준다. (axio를 통해 받을때)
app.use(express.urlencoded({ extended: true })); // form submit시의 데이터를 해석해서 req.body에 넣어 준다 .  (일반 form데이터를 받을때)
/*쿠키에 랜덤한 문자열 정보를 넘기고 브라우저에서 서버로 요청할때 
쿠키를 담아서 보내면 그 랜덤한 문자열에 해당하는 정보를 찾는다.*/
app.use(cookieParser());
app.use(
  session({
    saveUninitialized: false,
    resave: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
      httpOnly: true,
      secure: false,
      domain: process.env.NODE_ENV === "production" && ".sonteve.com",
    },
  })
);
app.use(passport.initialize());
app.use(passport.session());

app.get("/", (req, res) => {
  console.log("hellonode");
  res.send("hello express");
});

app.use("/post", postRouter);
app.use("/posts", postsRouter);
app.use("/user", userRouter);

// 에러처리 미들웨어 존재하는부분
/* 
(기본 에러표시를 바꾸고 싶다면 생성해서 사용한다.)
app.use((err,req,res,next) => {})
*/

app.listen(80, () => {
  console.log("3065포트에서 대기중");
});

답변 2

·

답변을 작성해보세요.

0

손현준님의 프로필

손현준

질문자

2020.09.21

감사합니다..! 제가 잘못알고있었네요 sync는 테이블만 생성해주는거였군요

0

db를 말씀하시는 건가요? table을 말씀하시는 건가요?

react-nodebird는 db고 그 아래 Users, Posts 등은 테이블입니다.

sequelize.sync는 테이블을 만들어주는 기능으로 db가 존재하지 않으면 작동하지 않습니다.

대문자로 생성되는 걸 원치 않으시면 models에서 설정에 tableName: 'users', 이런 식으로 정확히 소문자로 tableName 옵션을 기입해주시면 됩니다.