npm安装命令:npm install ejs -save
工程结构说明:
bin:存放可执行文件。
node_modules:存放package.json中安装的模块,在package.json添加依赖的模块并安装后,存放在这个文件夹下。
public:存放image、css、js等文件。
routes:存放路由文件。
views:存放视图文件或者说模版文件。
app.js:启动文件,或者说入口文件。
package.json:存储着工程的信息及模块依赖,当在dependencies中添加依赖的模块时,运行npm install ,npm会检查当前目录下的package.json,并自动安装所有指定的模块。
启动文件app.js//通过require()加载模块
varcreateError=require('http-errors');
varexpress=require('express');
varpath=require('path');
varcookieParser=require('cookie-parser');
varlogger=require('morgan');
varindexRouter=require('./routes/index');
varusersRouter=require('./routes/users');
//生成express实例
varapp=express();
//设置views文件夹为存放视图文件的目录
app.set('views',path.join(__dirname,'views'));
//设置视图模板引擎为ejs
app.set('viewengine','ejs');
//加载日志中间件
app.use(logger('dev'));
//加载解析json的中间件。
app.use(express.json());
//加载解析urlencoded请求体的中间件
app.use(express.urlencoded({extended:false}));
//加载解析cookie的中间件
app.use(cookieParser());
//设置public文件夹为存放静态文件的目录
app.use(express.static(path.join(__dirname,'public')));
//路由控制器
app.use('/',indexRouter);
app.use('/users',usersRouter);
//捕获404错误,并转发到错误处理器
app.use(function(req,res,next){
next(createError(404));
});
//错误处理
app.use(function(err,req,res,next){
res.locals.message=err.message;
res.locals.error=req.app.get('env')==='development'?err:{};
res.status(err.status||500);
res.render('error');
});
module.exports=app;
bin/www文件:#!/usr/bin/envnode
/**
*模块依赖关系
*/
varapp=require('../app');
vardebug=require('debug')('helloworld:server');
varhttp=require('http');
/**
*从Express存储环境中获取端口号
*/
varport=normalizePort(process.env.PORT||'3000');
app.set('port',port);
/**
*创建HTTP服务
*/
varserver=http.createServer(app);
/**
*监听所有的网络接口
*/
server.listen(port);
server.on('error',onError);
server.on('listening',onListening);
/**
*Normalizeaportintoanumber,string,orfalse.
*/
functionnormalizePort(val){
varport=parseInt(val,10);
if(isNaN(port)){
//namedpipe
returnval;
}
if(port>=0){
//portnumber
returnport;
}
returnfalse;
}
/**
*EventlistenerforHTTPserver"error"event.
*/
functiononError(error){
if(error.syscall!=='listen'){
throwerror;
}
varbind=typeofport==='string'
?'Pipe'+port
:'Port'+port;
//handlespecificlistenerrorswithfriendlymessages
switch(error.code){
case'EACCES':
console.error(bind+'requireselevatedprivileges');
process.exit(1);
break;
case'EADDRINUSE':
console.error(bind+'isalreadyinuse');
process.exit(1);
break;
default:
throwerror;
}
}
/**
*EventlistenerforHTTPserver"listening"event.
*/
functiononListening(){
varaddr=server.address();
varbind=typeofaddr==='string'
?'pipe'+addr
:'port'+addr.port;
debug('Listeningon'+bind);
}
修改ejs扩展名为HTML
app.js文件修改varejs=require('ejs');
......
app.engine('html',ejs.__express);
app.set('viewengine','html');