关于 express 中间件踩坑记
Express4.x版本相对于3. x进行了很大的改变,其中4不再依赖内置的中间件,需要自己添加中间件;当学习的教程和自己本地安装的版本没有同步时,哈哈,就这样不知不觉掉坑里了。
basicAuth:登录验证中间件,网站添加身份认证功能,使用该中间件后,用户访问网站必须输入用户名和密码并通过难后才能访问网站。
1 var express = require('express'); 2 var app = express; 3 app.use(express.basicAuth({name:'testuser',password:'password'})); 4 app.get('/',function (req,res) { 5 res.send('你好'); 6 7 }); 8 app.listen(1342,'127.0.0.1')
首先,刚开始的时候是这样用的中间件,运行报错是第三行的代码:
然后查了下原因说是版本更新没有内置的中间件,需自己加载,安装加载后,你以为能用use方法直接使用?呵呵,各种报错,报错信息就不一一贴出来了,并且官网对4.x给出的中间件列表没有这个中间件
按着报错信息一路改呀改,终于写成这样可以了:
var express = require('express'); var app = express(); var basicAuth = require('basic-auth'); var auth = function(req, res, next) { function unauthorized(res) { res.set('WWW-Authenticate', 'Basic realm=Input User&Password'); return res.sendStatus(401); } var user = basicAuth(req); if (!user || !user.name || !user.pass) { return unauthorized(res); } if (user.name === 'User11' && user.pass === 'Password') { return next(); } else { return unauthorized(res); } }; app.get('/auth', auth, function(req, res) { res.send('nihao') }); app.listen(1024,'127.0.0.1');
看下效果图:
登录后:
代码解析:当用户输错用户名及密码时返回401 Unauthorized,应答中包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,引导用户填写合适Authorization头后再次发出请求。
basicAuth(req)将从req.headers.authorization中解析出用户输入的用户名和密码,然后设置用户认证的链接及对该链接下路径使用basicAuth中间件
app.get('/auth', auth, function(req, res) {
res.send('nihao')
});
最后,访问http://localhost:1024/auth链接将需要输入身份信息进行认证。
关于中间件的安装:npm install serve-favicon morgan method-override express-session body-parser multer errorhandler [email protected] [email protected] —save
1.不需要加载 app.router,它不再是一个合法的 Express 4 对象,删掉 app.use(app.router);。
2.确保加载中间件的顺序正确,加载完应用路由后再加载 errorHandler。