本文以express 4.xx版本为准
express.xxx相关
express.json()
作用:将请求中Content-type为「application/json」类型的请求数据,解析成json
使用PostMan发送Post请求,body内容为一段JSON
const express = require("express");
const app = express();
app.use((request, response, next) => {
// 由于请求以流的形式传输,顾最开始此处接收值为空对象
console.log("request", request.body); // {}
// 以流的形式获得数据
request.on("data", (chunk) => {
console.log("chunk::::", chunk.toString()); // 将二进制内容以字符串形式打印
});
response.send("hi!!!");
next();
});
app.listen(3000, () => {
console.log("监听端口3000中...");
});
使用express.json()后
const express = require("express");
const app = express();
app.use(express.json()); // 使用express.json中间件,会将请求库的Json自动处理
app.use((request, response, next) => {
console.log("request", request.body); // 此处接受的请求体已经为object
// 并且此处并不会接收数据data,也就可以不用写了
// request.on("data", (chunk) => {
// console.log("chunk::::", chunk.toString());
// });
response.send("hi!!!");
next();
});
app.listen(3000, () => {
console.log("监听端口3000中...");
});
express.raw()
作用:将请求体信息解析为「Buffer」
express.text()
作用:将请求体信息转换为「字符串」
express.urlencoded()
作用:将Content-Type为「application/x-www-form-urlencoded」类型(该类型以key=xxx&value=yyy的形式传输)的数据,解析成对象
express.Router()
作用:生成一个路由对象
// app.ts
const express = require("express");
const app = express();
app.get("/admin", (request, response, next) => {
response.end("这是admin页面");
next();
});
app.get("/user", (request, response, next) => {
response.end("这是user页面");
next();
});
app.listen(3000, () => {
console.log("监听端口3000中...");
});
如上述代码,当我们设置了「admin」和「user」等多个模块路由时,都会写在一个文件里面,显得比较杂乱。使用express.Router()后可以分模块建路由
// src/admin.ts
const express = require("express");
const router = express.Router();
// 此处其实在请求「/admin」路由的时候,就会命中此处
router.get("/", (request, response, next) => {
response.end("这里是admin路由的首页");
});
export default router;
// app.ts
import admin from './src/admin';
const express = require('express');
const app = express();
app.get('/admin', admin); // 此处就是将admin的router对象置于/admin路由的处理
app.listen(3000, () => {
console.log('listening 3000...');
});
express.static()
作用:用于挂载静态资源
const express = require("express");
const app = express();
app.use(express.static("yyy"));
app.use((request, response, next) => {
console.log(request.body);
next();
});
app.listen(3000, () => {
console.log("listening 3000...");
});
当我们将静态资源指定为yyy文件夹后,直接访问「http://localhost:3000」即可显示yyy文件夹下的index.html文件
app.xxx相关
app.get()
作用:封装对GET请求的处理,也可以获取app.set()设置的值
app.use((request, response, next) => {
const { method } = request;
// 以往需要根据method字段来判断是否为GET请求
if (method === "GET") {
...
}
});
// 现在可以直接使用app.get来对GET请求处理
app.get('/', (request, response, next) => {
})
app.post(),app.put()等同理
app.set()
作用:设置引擎模板上的属性
app.set('title', 'express');
app.get('title'); // express
app.locals
作用:将某个属性挂载到全局变量上。一旦app.locals设置属性后,该属性会贯穿整个生命周期,
const express = require("express");
const app = express();
app.locals.name = "Jason";
app.get("/", function (req, res) {
console.log(app.locals.name); // Jason
res.send("Admin Homepage");
});
app.listen(3000, () => {
console.log("listening 3000...");
});
request.xxx相关
- request.hostname
获取「主机名」
// Host: "example.com:3000"
console.dir(req.hostname)
// => 'example.com'
- request.accepts
检查可接受的请求的文档类型
response.xxx相关
- response.status
设置响应的状态码
- response.download
传送指定路径的文件
router相关
可以用router单独抽出一部分路由处理,比如以下router内容是对「user」部分的处理
const express = require("express");
const router = express.Router();
router.get("/", (request, response, next) => {
response.end("This is index");
});
router.get("/:id", (request, response, next) => {
response.end("This is id page");
});
router.get("/:id/edit", (request, response, next) => {
response.end("This is edit page");
});
module.exports = router;
import userRouter from './router/user'; // 将上述处理user部分的路由处理引入
app.use('/user', userRouter); // 路径是/user的时候,采用userRouter的路由处理