快速返回下一个()

时间:2018-04-14 05:28:07

标签: express

来自Java。正在搞乱ExpressJS,我发送一个next()之后返回一个函数如果我不添加返回,那么next()函数在调用next()后仍然执行代码,当前它工作,返回转义这个行为,但我想知道这是否是正确的方法,或者我是在开发糟糕的习惯。在代码序列方面,在next()之后没有什么是真的。

function('/login', (req,res, next) => {
    User.findOne({
    email: username
}, (err, user) => {
    if (user) {
        var validPassword = user.comparePassword(password);
        if (validPassword) {
            let token = Helpers.getJwt(user);
            res.send({
                success: true,
                message: 'Successful Login',
                token: token
            })
        } else {
            next(
                Boom.badRequest('Invalid Credentials.', {
                    success: false,
                    message: 'Credentials did not match our records.'
                }));
            return;
        }
    } else {
        next(
            Boom.badRequest('User not found.', {
                success: false,
                message: 'User was not found, please register.'
            }));
        return;
    }
});
编辑:我使用next(),我的错误中间件调用了中间件。

2 个答案:

答案 0 :(得分:2)

首先,你不是在这里做任何事情(双关语)。

如果在特定路线或一组路线app.use(middleware:function)的链中存在另一个中间件:功能,则调用中间件:next()函数。

示例:

app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id)
  next()
}, function (req, res, next) {
  res.send('User Info')
})

我建议你阅读Express Middlewares

所以是的,你想在继续请求之前检查用户是否有效。

下面的代码只是解释中间件的工作原理: 我们的想法是,一个中间件:function 处理请求并将控制权传递给链中的下一个函数。

我假设您的Boom.badRequest只生成一个json有效负载,例如{};

所以这可能是一种实现你想要的优雅方式,但是我不确定这样做是否理想,也许更适合检查用户的令牌是否有效。

app.post('/login', /*MiddleWare Function*/(req, res, next) => {
        User.findOne({email: username}, (err, user) => {
            if (user) {
                const validPassword = user.comparePassword(req.body.password);
                if (!validPassword) return res.status(401).send(Boom.badRequest('User not found.', {
                    success: false,
                    message: 'User was not found, please register.'
                }));
                req.token = Helpers.getJwt(user);
                next();// it will move execution to the next function we have below
            } else {
                res.status(401).send(Boom.badRequest('User not found.', {
                    success: false,
                    message: 'User was not found, please register.'
                }));
              //no need to next here.
            }
        })
    }, /*OUR NEXT FUNCTION*/(req, res) => {
        res.send({
            success: true,
            message: 'Successful Login',
            token: req.token//notice that our token can be retrieved here
        })
    });

因此,一般来说,您可能只想拥有一个中间件:首先在特定路径组上调用的函数。

app.use(['/users*', '/logout'], (req, res, next) => {
   /*
    * What this means is that for every request that maps to /users 
    * or /logout this middleware:function will be called first.
    */
   //we can check|test if this visitor has valid credentials.
   next();//passes control to app.get('/users/whatEverItIS?') or app.post('/logout');
});

app.post('/users/whatEverItIs', (req, res)=>{
  res.send("I passed the middleware test that is why im called");
});

答案 1 :(得分:0)

不需要return语句。首先,由于您没有返回任何内容,其次是因为您使用next方法将控制权传递给下一个中间件,因此返回在那里没用,并且将返回undefined