什么是 express 中间件?中间件在字面上的意思是你在软件的一层和另一层中间放置的任何东西。express 中间件是在对 express 服务器请求的生命周期内所执行的函数。每个中间件都可以访问其被附加到的所有路由的 http 请求和响应。另外,中间件可以终止 http 请求,也可以用 next 将其传递给另一个中间件函数。中间件的这种“链”使你可以对代码进行划分并创建可重用的中间件。编写 express 中间件的要求
你需要安装一些东西来创建、使用和测试 express 中间件。首先需要 node 和 npm。为确保已经安装,可以运行:
npm -v && node -v你应该看到已安装的 node 和 npm 版本。如果出现错误,则需要安装 node。所有例子都应在 node ver 8 和npm ver 5 下使用。
本文使用了 express 4.x 版。这很重要,因为从 3.x 版到 4.x 版有重大的更改。
express中间件:基础
首先我们使用 express 最基本的内置中间件。创建一个新项目并 npm 初始化它…
npm initnpm install express --savecreate server.js and paste the following code:const express = require('express');const app = express();app.get('/', (req, res, next) => { res.send('welcome home');});app.listen(3000);中间件解决什么问题?为什么要用它?
假设你在 web 网络服务器上正在使用 node.js 和 express 运行web应用程序。在此应用中,你需要登录的某些页面。
当 web 服务器收到数据请求时,express 将为你提供一个请求对象,其中包含有关用户及其所请求数据的信息。 express 还使你可以访问响应对象,可以在web服务器响应用户之前对其进行修改。这些对象通常缩短为 req,res。
中间件函数是使用相关信息修改 req 和 res 对象的理想场所。例如用户登录后,你可以从数据库中获取其用户详细信息,然后将这些详细信息存储在 res.user 中。
中间件函数是什么样的?
async function usermiddleware (req, res, next) { try { const userdata = await getuserdata(req.params.id); //see app.get below if(userdata) { req.user = userdata; next(); } } catch(error) { res.status(500).send(error.message); //replace with proper error handling }}如果出现错误,并且你不想执行其他代码,则不要调用该函数。请记住在这种情况下要发送响应,否则客户端将会等待响应直到超时。
var app = express();//your normal route handlersapp.get('/user/:id', usermiddleware, usercontroller);中间件链
你可以在中间件数组中或着通过使用多个 app.use 调用来链接中间件:
app.use(middlewarea);app.use(middlewareb);app.get('/', [middlewarec, middlewared], handler);express 收到请求后,与请求相匹配的每个中间件都将会按照初始化的顺序运行,直到有终止操作为止。
因此,如果发生错误,则将按顺序调用所有用于处理错误的中间件,直到其中一个不再调用 next() 函数调用为止。
express中间件的类型路由器级中间件,例如:router.use内置中间件,例如:express.static,express.json,express.urlencoded错误处理中间件,例如:app.use(err,req,res,next)第三方中间件,例如:bodyparser、cookieparser路由器级中间件
express.router 使用 express.router 类创建模块化的、可安装的路由处理。路由实例是一个完整的中间件和路由系统。
你可以用中间件进行日志记录、身份验证等操作。如下所示,以记录用户的最新活动并解析身份验证标头,用它确定当前登录的用户并将其添加到 request 对象。该函数在程序每次收到请求时执行。如果有错误,它会仅结束响应,而不会调用后续的中间件或路由处理。
var router = express.router()//load router-level middleware by using the router.use() and router.method() functions.//the following example creates a router as a module, loads a middleware function in it,// defines some routes, and mounts the router module on a path in the main app.var express = require(‘express’);var router = express.router();// a middleware function with no mount path. this code is executed for// every request to the router// loggingasync function logmiddleware (req, res, next) { try { console.log(req.user.id, new date()); next(); } catch() { res.status(500).send(error.message); }}// authentication async function checkauthentication(req, res, next) => {// check header or url parameters or post parameters for tokenconst token = req.body.token || req.query.token || req.headers['x-access-token'] || req.headers['authorization']; if (token) { try { // verifies secret req.decoded = await jwt.verify(token, config.secret) let checkuser = await authenticatetokenhelper.getuserdetail(req); // if everything is good, save to request for use in other routes if (checkuser) { req.user = req.decoded next() } else { return res.status(403).json({ message: responsemessage.noauthorized }) } } catch (err) { return res.status(401).json({ message: responsemessage.invalidtoken }) } } else { // if there is no token return res.status(400).json({ message: responsemessage.invalidrequest }) }}router.use(logmiddleware); router.get('/user, checkauthentication, handler);内置中间件<
b站怎么删除自己的投稿 b站删除投稿视频的方法【滁州seo】了解英文网站SEO优化技巧2019年阿里云国外服务器打折备案信息不实问题-其他问题如何像使用虚拟主机一样使用ECS轻应用服务器和云服务器区别干货分享 微信营销小技巧怎么看硬盘