inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

redis에 세션 저장하기

pm2 error

596

김명재

작성한 질문수 10

0

const express = require("express");
const cookieParser = require("cookie-parser");
const morgan = require("morgan");
const session = require("express-session");
const router = express.Router();
const path = require("path");
const dotenv = require("dotenv");
const passport = require("passport");
const app = express();
const passportConfig = require("./passport");
const redis = require("redis");
const RedisStore = require("connect-redis").default;

dotenv.config();

const redisClient = redis.createClient({
  url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`,
  password: process.env.REDIS_PASSWORD,
  legacyMode: false,
});
redisClient.connect().catch(console.error);

const authRouter = require("./routes/auth");
const pageRouter = require("./routes/page");
const postRouter = require("./routes/post");
const userRouter = require("./routes/user");
const commentRouter = require("./routes/comment");
const updateRouter = require("./routes/update");
const deleteRouter = require("./routes/delete");
const helmet = require("helmet");
const hpp = require("hpp");
const { sequelize } = require("./models");
const logger = require("./logger");

passportConfig();
app.set("port", process.env.PORT || 8005);

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

if (process.env.NODE_ENV === "production") {
  app.use(
    helmet({
      contentSecurityPolicy: false,
      crossOriginEmbedderPolicy: false,
      crossOriginResourcePolicy: false,
      crossOriginOpenerPolicy: false,
      originAgentCluster: false,
    })
  );
  app.use(hpp());
  app.use(morgan("combined"));
} else {
  app.use(morgan("dev"));
}
app.use(express.json({ limit: "10mb" }));
var cors = require("cors");
const { deepStrictEqual } = require("assert");
app.use(cors());
app.use("/img", express.static(path.join(__dirname, "uploads")));
app.use("/profileImg", express.static(path.join(__dirname, "profileImg")));
app.use(express.json());
app.use(express.urlencoded({ limit: "10mb", extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
const sessionOption = {
  resave: false,
  saveUninitialized: false,
  secret: process.env.COOKIE_SECRET,
  cookie: {
    httpOnly: true,
    secure: false,
  },
  store: new RedisStore({ client: redisClient }),
};
if (process.env.NODE_ENV === "production") {
  sessionOption.proxy = true;
}
app.use(session(sessionOption));

app.use(passport.initialize());
app.use(passport.session());


app.use(express.static(path.join(__dirname, "prototype-client/build")));

app.get("/", (req, res) => {
  res.sendFile(path.join(__dirname, "prototype-client/build/index.html"));
});

app.use("/page", pageRouter);
app.use("/auth", authRouter);
app.use("/post", postRouter);
app.use("/user", userRouter);
app.use("/comment", commentRouter);
app.use("/update", updateRouter);
app.use("/delete", deleteRouter);

//react에서 react-router-dom으로 다룰 수 있게
app.get("*", function (req, res) {
  res.sendFile(path.join(__dirname, "/prototype-client/build/index.html"));
});


//에러 처리 담당
app.use((req, res, next) => {
  const error = new Error(`${(req, method)} ${req.url} 라우터가 없습니다.`);
  error.status = 404;
  logger.info("hello");
  logger.error(error.message);
  next(error);
});

app.use((err, req, res, next) => {
  console.error(err);
  res.locals.message = err.message;
  res.locals.erorr = process.env.NODE_ENV !== "production" ? err : {};
  res.status(err.status || 500);
  res.render("error");
});

module.exports = app;

이렇게 코드를 실행하면 sudo pm2 monit의 server log에 2가지 에러가 나옵니다.


server > [Error: ENOENT: no such file or directory, stat

│ ││ server > errno: -2,

│ ││ server > code: 'ENOENT',

│ ││ server > syscall: 'stat',

│ ││ server > path: '/home/bitnami/Whats-up/prototype-client/bu │

│ ││ server > expose: false,

│ ││ server > statusCode: 404,

│ ││ server > status: 404

│ ││ server > }

에러 메시지를 봤을때 해당 경로에 대한 파일을 찾을 수 없다고 하는데 ls를 입력했을때 잘 있는걸 확인 할 수 있는데 왜 이런 에러가 발생하는지 모르겠습니다..
스크린샷 2023-11-21 오후 5.29.27.png

2번쨰는
server > Error: No default engine was specified and no

││ server > at new View (/home/bitnami/Whats-up/node_module │

││ server > at Function.render (/home/bitnami/Whats-up/node │

││ server > at ServerResponse.render (/home/bitnami/Whats-u │

││ server > at /home/bitnami/Whats-up/app.js:127:7 │

││ server > at Layer.handle_error (/home/bitnami/Whats-up/n │

││ server > at trim_prefix (/home/bitnami/Whats-up/node_mod │

││ server > at /home/bitnami/Whats-up/node_modules/express/

││ server > at Function.process_params (/home/bitnami/Whats

이런 에러가 발생합니다. 에러 메세지를 봤을떄는 view engine관련된 에러같은데 react랑 express연동할때는 따로 view engine 설정을 주지 않고 express.static으로 리액트 코드를 전달하면 되는거 아닌가요?

node.js mysql mongodb express typescript socket.io jwt

답변 2

0

제로초(조현영)

ls /home/bitnami/Whats-up/prototype-client/build/index.html

해보세요

0

김명재

감사합니다..선생님
ls 해서 build파일이 있는지 없는지 확인했더라면 좋았을텐데... 당연히 github에 잘 올라갔는줄 알고 ls할 생각을 못했네요... gitignore에 /build가 있었습니다. 정말 감사합니다

0

제로초(조현영)

res.render를 사용하면 view engine 에러가 발생합니다. res.render가 아니라 res.sendFile로 index.html을 주셔야 합니다.

0

김명재

답변 감사합니다.
그런데


app.get("/", (req, res) => { res.sendFile(path.join(__dirname, "/prototype-client/build/index.html")); }); app.use("/page", pageRouter); app.use("/auth", authRouter); app.use("/post", postRouter); app.use("/user", userRouter); app.use("/comment", commentRouter); app.use("/update", updateRouter); app.use("/delete", deleteRouter); //react에서 react-router-dom으로 다룰 수 있게 app.get("*", function (req, res) { res.sendFile(path.join(__dirname, "/prototype-client/build/index.html")); });

이 코드를 실행하고 보면

아래와 같은 에러가 발생합니다.
server > [Error: ENOENT: no such file or directory, stat │

│ ││ server > errno: -2,

│ ││ server > code: 'ENOENT',

│ ││ server > syscall: 'stat',

│ ││ server > path: '/home/bitnami/Whats-up/prototype-client/build/s │

│ ││ server > expose: false,

│ ││ server > statusCode: 404,

│ ││ server > status: 404

│ ││ server > }
이 에러가 왜 발생하는지 도저히 이해가 안됩니다.. 로컬에서는 분명히 잘 실행 되었습니다..
혹시 문제를 해결할만한 힌트라도 주실 수 있으신가요?..

0

제로초(조현영)

build/s 라고 나오는데 s가 뭔 파일인가요?

0

김명재

아 저게 에러에 원래 build/i 밖에 안나와서 뭔가 이상해서 테스트 좀 해본다고

app.get("/", (req, res) => {   res.sendFile(path.join(__dirname, "/prototype-client/build/index.html")); }); 

에서 index.html을 잠시 sdex.html로 고치고 실행해본건데 원래는 build/i라고 나옵니다. 제 생각에는 칸수가 안되서 i까지 밖에 안나오는 것 같습니다

깃헙 질문

0

82

2

강의 1-1 수업노트의 로드맵 링크가 작동하지 않습니다.

0

76

1

aws - lightsail 이용 관련

0

58

1

4강 http 서버 만들때 ESM방식으로 해도 될까요?

0

81

2

모듈 사용 시 단점이 있나요?

0

81

1

node.js 버전 및 typescript 적용 문의

0

93

2

12.7. 방장기능(강퇴) 질문드립니다.

0

80

2

12.7 socket.js코드 그대로 뱃겨서 했는데, socket.request.session.color가안나오네요

0

69

1

12.7 코드 그대로 뱃겨서 햇는데 스샷같이 오류가뜹니다.

0

75

2

12.7.1스스로 해보기 질문되나요

0

95

3

시퀄라이즈 실습하기 질문드립니다.

0

196

9

<7-5. 시퀄라이즈 사용하기>수업 질문 드립니다.

0

97

2

크롬에서 user id를 인풋에 입력하고 등록하면 404 에러처리 페이지가 뜹니다.

0

113

2

구매 결제관련 질문입니다 !

0

122

1

다수의 supertest 가 실행될 때 force:true로 인한 DB 초기화 문제

0

133

2

node 설치 방법이 전혀다르게 바뀐것 같습니다.

0

152

2

12강 깃허브에 있는 12.7 chat.html 복붙했는데 css오류

0

122

2

무료/프리미엄 동시 소유 시 질문

0

117

1

비주얼 스튜디오 코드로 계속 진행해도 괜찮을까요?

0

135

2

10강 cors에러 localhost:4000으로 접속했을때 에러

1

159

2

webstorm 해결할 수 없는 변수 문제

0

155

2

혹시 몽고DB 쓸거면 MySQL 강의 스킵해도 되나요?

0

149

2

LightSail 실행 중 오류 질문드립니다!

0

204

2

RedisStore 사용법 질문

0

133

2