NodeJs从零单排第七期
看看app.js这个文件。
var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express();
前面6行请求了系统模块。接着2行请求了routes下的路由文件。
var app = express(); 生成一个express实例。
// view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade');
注释已经很清楚了,视图引擎设置。第一行设置使用views文件夹存放模版,第二行设置使用jade作为模版引擎。
// uncomment after placing your favicon in /public //app.use(favicon(__dirname + '/public/favicon.ico')); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users);
前2行看翻译,取消注释后放置你的favicon图标在public目录下。
app.use(logger('dev')); 加载日志中间件。
app.use(bodyParser.json()); 加载解析json的中间件。
app.use(bodyParser.urlencoded({ extended: false })); 加载解析urlencoded请求体的中间件。
app.use(cookieParser()); 加载解析cookie的中间件。
app.use(express.static(path.join(_dirname, 'public'))); 设置public文件夹为存放静态文件的目录。
最后2行为路由控制器。
这里反复提到了中间件这个概念。英文单词为middleware。
简单理解就是处理一个事件的中间过程,当一个请求过来的时候,会依次被这些中间件处理。
其实这里用到了NodeJs的中间件框架Connect。express是基于Connect开发的。
express的use方法用于加载中间件。
// catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); });
同样,我们翻译注释。捕获404错误并转发到错误处理器。
// error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); }
这里就是错误处理器,开发环境下的错误处理器,将打印堆栈轨迹。
会渲染views下error.jade页面并将错误信息显示到浏览器中。
// production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); module.exports = app;
生产环境下的错误处理器,没有堆栈跟踪泄露给用户。
会渲染views下error.jade页面并将错误信息显示到浏览器中。
最后将app实例封装成模块。