express浅析

Express框架建立在node.js内置的http模块上,核心是对http模块的再包装,等于在http模块之上,加了一个中间层

中间件(middleware)

中间件就是处理HTTP请求的函数,在实例运行过程中会调用一系列中间件.
每个中间件可以从App实例,接收三个参数,依次为request对象(代表HTTP请求)、response对象(代表HTTP回应),next回调函数(代表下一个中间件)。每个中间件都可以对HTTP请求(request对象)进行加工,并且决定是否调用next方法,将request对象再传给下一个中间件

var path = require('path');
var express = require('express');
var app = express();
var indexRouter = require('./routes/index');
var userRouter = require('./routes/users');

app.set('views', path.join(__dirname, 'views'));// 设置存放模板文件的目录
app.set('view engine', 'ejs');// 设置模板引擎为 ejs

app.use(express.static('public'));
// app.use('/', indexRouter);
app.use('/users', userRouter);
app.get('/', function (req, res) {
    res.sendfile('./public/login.html');
});
app.use("/home", function(request, response, next) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Welcome to the homepage!\n");
});

app.use("/about", function(request, response, next) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Welcome to the about page!\n");
});

app.use(function(request, response) {
    response.writeHead(404, { "Content-Type": "text/plain" });
    response.end("404 error!\n");
});

app.listen(8000);

程序顺序执行,最后一个中间件没有调用next();执行到该处中间件的传递终止,若前面的路径一旦有一个匹配成功则不再继续执行下边的中间件.

访问结果:


use是express注册中间件的方法,它返回一个函数
use方法也允许将请求网址写在第一个参数。这代表,只有请求路径匹配这个参数,后面的中间件才会生效

set方法

set方法用于指定变量的值

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
response.sendFile

response.sendFile方法用于发送文件,发送文件需要完整的路径名
一般用于静态网页

    res.sendfile('./public/login.html');

发送所在文件夹的文件可以用

       res.sendFile(__dirname + '/login.html');
指定静态文件目录

默认为public,用来存放图片,样式表等静态文件

app.use(express.static('public'));
访问结果
模板引擎

这里用ejs举例,先安装ejs

npm i ejs --save
app.set('views', path.join(__dirname, 'views'));// 设置存放模板文件的目录
app.set('view engine', 'ejs');// 设置模板引擎为 ejs

在 views 下新建 users.ejs,添加如下代码:

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body {padding: 50px;font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;}
</style>
</head>
<body>
<h1><%= name.toUpperCase() %></h1>
<p>hello, <%= name %></p>
</body>
</html>

ejs 有 3 种常用标签:

  • <% code %>:运行 JavaScript 代码,不输出
  • <%= code %>:显示转义后的 HTML内容
  • <%- code %>:显示原始 HTML 内容

更多标签参考官方文档
users.js中调用 res.render(模板的名字,传给模板的数据) 函数渲染 ejs 模板

var express = require('express');
var router = express.Router();

router.get('/:name', function(req, res) {
    res.render('users', {
        name: req.params.name
    });
});

module.exports = router;

启动服务器:

node app.js  

访问结果中name是动态可变化的:

我的post.js代码(重新定义了一个服务器,端口8080)

var http = require('http');
var querystring = require('querystring');
var util=require('util');

http.createServer(function (req, res) {
    var body = "";
    req.on('data', function (chunk) {
        body += chunk;
    });
    req.on('end', function () {
        // 解析参数
        body = querystring.parse(body);
        // 设置响应头部信息及编码
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});

        if(body.name && body.number) { // 输出提交的数据
            res.write("yourName:" + body.name);
            res.write("<br>");
            res.write("number:" + body.number);
        }
        res.end();
    });
}).listen(8080);

启动服务器:

node post.js
点击提交跳转到8080

Demo的GitHub地址

推荐阅读更多精彩内容