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