express generator로 생성한 프로젝트에 대한 구성 파일 중에
실행에 큰 영향을 미치는 것이 app.js와 www
var createError = require("http-errors"); // HTTP 오류를 생성하는 데 사용 var express = require("express"); // Express 프레임워크를 가져옴 var path = require("path"); // 파일 및 디렉토리 경로를 처리하는 데 사용 var cookieParser = require("cookie-parser"); // 쿠키를 파싱하는 미들웨어 var logger = require("morgan"); // HTTP 요청 로깅 미들웨어 // routes 디렉토리에서 정의된 라우터를 가져옴 var indexRouter = require("./routes/index"); // routes/index.js에서 정의된 라우터 var usersRouter = require("./routes/users"); // Express 애플리케이션 생성 var app = express(); // app 객체에 대한 특징, 즉 우리가 생성할 웹 서버의 특징을 기술하는 부분 // view engine setup - 뷰 엔진 설정 app.set("views", path.join(__dirname, "views")); // views 디렉토리의 경로를 설정(화면을 보이게 할 뷰 템플릿 파일들이 있는 경로를 라우팅하기 위해 그 값을 미리 정의) // 앞으로 뷰 템플릿 파일을 만들고 난 후, views 폴더 안에 넣어주고 라우팅을 설정해주면 됨 app.set("view engine", "jade"); // 템플릿 엔진으로 Jade(현재는 Pug)를 사용하도록 설정 // 뷰에 사용될 기본 엔진의 이름을 정의합니다. express에서는 ejs, pug(구 jade에서 pug로 이름이 변경됨) 등을 지원하고 있음 app.use(logger("dev")); // 개발 모드에서 HTTP 요청을 로그로 기록 app.use(express.json()); app.use(express.urlencoded({ extended: false })); // URL 인코딩된 요청 본문을 파싱 app.use(cookieParser()); app.use(express.static(path.join(__dirname, "public"))); app.use("/", indexRouter); // 경로로 들어오는 요청은 indexRouter의 핸들러로 전달 app.use("/users", usersRouter); // catch 404 and forward to error handler app.use(function (req, res, next) { // 요청한 페이지를 찾을 수 없는 경우(404 오류) 발생 next(createError(404)); }); // error handler - 일반 오류 핸들러 app.use(function (err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get("env") === "development" ? err : {}; // render the error page res.status(err.status || 500); res.render("error"); }); module.exports = app;
www.js
app.js 소스를 살펴보면 http에 관한 설정이 없음.
따라서 이 파일만으로는 웹서버를 구동시킬 수 없음.
express-generator에서는 http에 관한 설정을 www.js로 따로 빼놓았는데, bin 폴더로 가면 확인할 수 있음. 즉, 웹 서버와 관련된 부분은 /bin/www 에 들어있음.
앞으로 사용하게 될 npm start라는 명령어도 이 www 파일을 실행시키는 명령어임.
/bin/www.js 소스에서 포트 설정에 관한 부분은
var port = normalizePort(process.env.PORT || "3000"); // 웹 서버의 포트값을 설정하는 부분 app.set("port", port); var server = http.createServer(app); // 이 코드의 포트 설정으로 http 서버를 만듦
#!/usr/bin/env node /** * Module dependencies. */ var app = require("../app"); var debug = require("debug")("express-init:server"); var http = require("http"); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || "3000"); // 웹 서버의 포트값을 설정하는 부분 app.set("port", port); /** * Create HTTP server. */ var server = http.createServer(app); // 이 코드의 포트 설정으로 http 서버를 만듦 /** * Listen on provided port, on all network interfaces. */ // 포트 번호와 주소 출력 server.listen(port, () => { console.log(`서버가 http://localhost:${port} 에서 실행 중입니다.`); }); server.on("error", onError); server.on("listening", onListening); /** * Normalize a port into a number, string, or false. */ function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ function onError(error) { if (error.syscall !== "listen") { throw error; } var bind = typeof port === "string" ? "Pipe " + port : "Port " + port; // handle specific listen errors with friendly messages switch (error.code) { case "EACCES": console.error(bind + " requires elevated privileges"); process.exit(1); break; case "EADDRINUSE": console.error(bind + " is already in use"); process.exit(1); break; default: throw error; } } /** * Event listener for HTTP server "listening" event. */ function onListening() { var addr = server.address(); var bind = typeof addr === "string" ? "pipe " + addr : "port " + addr.port; debug("Listening on " + bind); }