express 接口请求之前处理,自定义鉴权中间件,并可携带参数

前言

express.js中的中间件是一种处理应用程序中常见功能的强大,优雅的方法。

例如在请求某个接口之前拦截,通过req和res对接口进行处理,通过next()进入下一步。

1.创建一个中间件文件(verifify.js)

鉴权中间件

// 权限校验
function auth(req, res, next) {
  const token = req.headers.token;
  if (token) {
    next();
  } else {
    res.status(401).send('No permission, please log in');
  }
}

exports.auth = auth;

2.路由文件引入外部js文件

var express = require('express');
var router = express.Router();
// 使用require引入外部js文件
// 参数是相对路径
var verifify= require('../verifify.js');

3.配置中间件

var express = require('express');
var router = express.Router();
// 使用require引入外部js文件
// 参数是相对路径
var verifify= require('../verifify.js');

// 中间件设置
const app = express();
// 将中间件传入
app.use(verifify.auth);

4.使用中间件

var express = require('express');
var router = express.Router();
// 使用require引入外部js文件
// 参数是相对路径
var verifify= require('../verifify.js');

// 中间件设置
const app = express();
// 将中间件传入
app.use(verifify.auth);

// 在接口方法之间,添加鉴权中间件
router.get('/list', verifify.auth, function (req, res, next) {
  res.json({
    code: 200,
    data: [],
    msg: '成功'
  });
});

module.exports = router;

5.中间件携带参数

router.get('/list', verifify.auth('hello'), function (req, res, next) {
  res.json({
    code: 200,
    data: [],
    msg: '成功'
  });
});

修改verifify.js,并确保不会为同一函数制作多个副本

function auth(params) {
	return auth[params] || (auth[params] = function (req, res, next) {
  		const token = req.headers.token;
  		if (token) {
    		next();
  		} else {
    		res.status(401).send('No permission, please log in');
  		}
  	});
}

exports.auth = auth;

6.遇到问题

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent
to the client

res.send() 或res.json()这类客户端返回的方法一个请求只能返回一次,如果多次返回就会出现这个错误!

如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。

你可能感兴趣的:(node,express,nodejs,中间件)