我从从互联网下载的一个工作项目中提取了以下 3 个代码片段:
文件:./routes.js
// ...
var passport = require('passport');
var requireLoginLocal = passport.authenticate('local', { session: false });
var authController = require('./controllers/authController');
// ...
module.exports = function(app) {
// ...
authRoutes.post('/login/local', requireLoginLocal, authController.login);
// ...
}
文件:./config/passport.js
// ...
var LocalStrategy = require('passport-local').Strategy;
// ...
module.exports = function(passport) {
passport.use(new LocalStrategy({
usernameField: 'email' /* changing default */
},
function(email, password, done) {
email = email.toLowerCase();
User.findOne({
'email': email
},
function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { error: 'Login failed. Please try again.' });
}
user.comparePassword(password, function(err, isMatch) {
if (err) {
return done(err);
}
if (!isMatch) {
return done(null, false, { error: 'Login failed. Please try again.' });
}
return done(null, user);
});
}
);
}
));
};
文件:./controllers/authController.js
// ...
exports.login = function(req, res, next) {
var userInfo = getUserInfo(req.user);
res.status(200).json({
token: 'JWT ' + generateToken(userInfo),
user: userInfo
});
}
// ...
我有以下问题:
1- 文件上:./routes.js
,行上:
authRoutes.post('/login/local', requireLoginLocal, authController.login);
数据如何从第二个参数传递到第三个参数?
2- 在文件:./config/passport.js
中,这些返回值如何影响从该行的第 2 个参数传递到第 3 个参数的值以上?
3- 在文件上:./controllers/authController.js
,在函数上:exports.login
,没有返回任何东西,所以,这如何影响从第三个参数传递的值以及在上面的假设行上可能的第四个参数?
最佳答案
您的第一个问题和第二个问题是相关联的。这是 Node 在这种情况下专门表达的中间件模式。 This arcticle 在 IMO 中很好地解释了这一点。
在我的理解和简单的术语中,它们是传递 req、res 对象 ( info here ) 的函数,通过添加它们自己的更改。
在您的代码中,您的 requireLoginLocal 会将其需要的任何内容添加到响应对象并接下来调用,在这种情况下, Node 会将响应对象传递给 authController.login 等等。当链中的所有中间件都完成了必要的更改后,最终响应将作为 http 响应发送
关于你的第二个问题,它可能被passport用于配置。 passport中间件的实际中间件由这一行提供
passport.authenticate('local', { session: false });
由于这是 node 的深层基础主题,您可以在 google 上搜索 node middleware 并且可以找到大量关于此的文章
关于javascript - 需要帮助了解 Node JS/Passport JS 的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50036822/