函数处理路由如何能够采用两个以上的参数?

时间:2017-05-11 12:48:59

标签: javascript node.js authentication callback passport.js

我是节点js的新手。我正在使用jwt理解身份验证。据我所知,快递中的请求处理程序就是这样的

app.post('/login',function(req,res){...});

以下是我感到困惑的片段。

app.js

var userController = require('./Controllers/user');
var authController = require('./Controllers/auth');
var tokenController = require('./Controllers/validate');
var deviceController = require('./Controllers/device');

app.post('/login',userController.validate,authController.authorize,userController.login);

如果仔细观察,发布方法有4个参数。 任何人都可以解释以下功能如何运作?

app.post('/login',userController.validate,authController.authorize,userController.login);


另外添加开发人员导入的js文件

user.js的

exports.validate = function(req,res,next) {
  if(req.body.email === undefined){
      return res.status(401).send({'message':'Email is required'});
  }

  if(req.body.password === undefined){
      return res.status(401).send({'message':'Password is required'});
  }

  next();
};

const login = exports.login = function (req,res){
    User.findOne({email:req.body.email},function(err, user){
        if(err){
            return res.status(401).send(err);
        }
        user.token = jwt.sign(user.password, 'TOPSECRETTTT');
        user.save(function (err,user) {
            if (err) {
                res.send(err);
                return;
            }
            res.status(200).send({email:user.email,loginToken:user.token});
        })
    });
};

auth.js

passport.use(new LocalStrategy({
        usernameField: 'email',
        passwordField: 'password'
    },
    (function(username, password, callback) {
        User.findOne({ email: username }, function(err, user) {
            if (err) {
                return callback(err);
            }

            if (!user) {
                return callback(null, false);
            }

            user.matchPassword(password, function(err, isMatch) {
                if (err) {
                    return callback(err);
                }

                if (!isMatch) {
                    return callback(null, false);
                }

                return callback(null, user);
            });
        });
    })));

exports.authorize = passport.authenticate('local', { session: false });

如果有任何源/链接我可以找到更多这样的实现,请告诉我。

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,express是关于中间件的 - 如果它与路由匹配,它将按顺序浏览这些中间件函数,直到它到达res.send()

在这种情况下,您的中间件会验证POST数据,然后创建用户,对其进行身份验证并返回授权令牌。每个中间件使用next();继续到链中的下一个中间件,如果它在任何时候失败,它会发送相应的失败响应,其中res.send()状态代码为错误。在这种情况下401 Unauthorized