javascript - 需要帮助了解 Node JS/Passport JS 的工作原理

标签 javascript angularjs node.js express passport.js

我从从互联网下载的一个工作项目中提取了以下 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 ) 的函数,通过添加它们自己的更改。

enter image description 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/

相关文章:

javascript - Firebase storage.object().onChange 现已弃用,

javascript - 无法解释该模式的结果

angularjs - Spring REST 调用提供 302 重定向

node.js - 如何在路径中创建文件夹?

javascript - 像鼠标事件一样在触摸时检索相同的 offsetX

javascript - 如何使用dom(数据表)进行操作?

javascript - 自定义指令不验证表单。为什么不?

javascript - 单击按钮更改div

node.js - Kuzzle 创建集合映射不起作用

java - 树结构中的递归回溯