Node.js开发Web后台服务(四)之Express框架
文章栏目194919490
发布时间:2019-02-19 15:58:58

五、Express

5.1、Express框架核心特性

Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。
使用 Express 可以快速地搭建一个完整功能的网站。使用Node.js作为AngularJS开发Web服务器的最佳方式是使用Express模块。
Express官网: http://expressjs.com/Express4.x
API:http://expressjs.com/zh-cn/4x/api.html

Node.js开发Web后台服务(四)之Express框架

5.2、Express框架核心特性

可以设置中间件来响应 HTTP 请求。
定义了路由表用于执行不同的 HTTP 请求动作。
可以通过向模板传递参数来动态渲染 HTML 页面。
丰富的 HTTP 快捷方法和任意排列组合的 Connect 中间件,让你创建健壮、友好的 API 变得既快速又简单。Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功能。

5.3、安装 Express

安装 Express 并将其保存到依赖列表中:

npm install express --save

以上命令全局安装express。也可安装时指定安装中间件。
body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
multer - node.js 中间件,用于处理 enctype=”multipart/form-data”(设置表单的MIME编码)的表单数据。

$ npm install body-parser --save
$ npm install cookie-parser --save
$ npm install multer --save

默认这些模块都已经添加。

Node.js开发Web后台服务(四)之Express框架

5.4、第一个Express框架实例
接下来我们使用 Express 框架来输出 “Hello World”。
以下实例中我们引入了 express 模块,并在客户端发起请求后,响应 “Hello World” 字符串。
创建一个目录,如Project,进入命令行:
使用npm install express 导入express模块。
在目录下创建hello.js文件,如下所示:

//引入express模块
var express = require(‘express’);//创建一个app对象,类似一个web 应用(网站)var app = express();//接受指定路径的请求,指定回调函数
app.get(‘/‘, function (req, res){
res.send(‘Hello World’);
});
//创建一个web服务器,可以认为就是web服务器对象
//监听8081端口,当监听成功时回调
var server = app.listen(8081, function () {
var host = server.address().address;//地址
var port = server.address().port;//端口
console.log(“应用实例,访问地址为 http://%s:%s“, host, port);
});

使用node执行js:

Node.js开发Web后台服务(四)之Express框架

运行结果:

Node.js开发Web后台服务(四)之Express框架

5.5、使用Nodeclipse开发Express项目
如果直接使用记事本效率会不高,nodeclipse插件可以方便的创建一个Express项目,步骤如下:

Node.js开发Web后台服务(四)之Express框架

创建好的项目如下:

Node.js开发Web后台服务(四)之Express框架

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 index = require('./routes/index');
var users = require('./routes/users');
var app = express();//指定视图引擎为ejsapp.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public//
app.use(favicon(path.join(__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('/', index);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;  next(err);});
// 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;
bin\www是web服务器:
#!/usr/bin/env node/** * 依赖模块,导入 */
var app = require('../app');
var debug = require('debug')('nodejsexpress:server');
var http = require('http');
/** * 从上下文环境中获得监听端口,如果空则3000 */
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/** * 创建Web服务器 */
var server = http.createServer(app);/** * 开始监听 */
server.listen(port);
server.on('error', onError);  //指定发生错误时的事件
server.on('listening', onListening);  //当监听成功时的回调/** * 规范化端口 */
function normalizePort(val) {
    var port = parseInt(val, 10);
    if (isNaN(port)) {
        // named pipe
        return val;
    }
    if (port >= 0) {
        // port number
        return port;
    }
    return false;
}
/** *错误事件监听 */
function onError(error) {
    if (error.syscall !== 'listen') {
        throw error;
    }
    var bind = typeof port === 'string'    ? 'Pipe ' + port    : 'Port ' + port;  //错误处理
    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;  
    }
}
/** * 当用户访问服务器成功时的回调 */
function onListening() {
    var addr = server.address();
    var bind = typeof addr === 'string'    ? 'pipe ' + addr    : 'port ' + addr.port;
    debug('Listening on ' + bind);
}

routers/index.js路由,有点类似控制器或Servlet:

var express = require('express');
var router = express.Router();/* 获得首页 */
router.get('/', function(req, res, next) {
    res.render('index', { title: 'Express' });
});
module.exports = router;

views/index.ejs首页视图:

<!DOCTYPE html>
<html>
    <head>
        <title><%= title %></title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
    </head>
    <body>
        <h1><%= title %></h1>
        <p>Welcome to <%= title %></p>
    </body>
</html>

在www上右键选择”运行方式”->”Node Application”运行结果:

Node.js开发Web后台服务(四)之Express框架

Node.js开发Web后台服务(四)之Express框架