Express 下一次之后快速返回()

Express 下一次之后快速返回(),express,Express,来自爪哇。在处理ExpressJS时,如果我不添加返回,我会在发送next()后从函数中返回,然后调用next()时,next()函数后的代码仍会执行,目前它可以工作,return会逃避这种行为,但我想知道这是否是正确的方法,还是我开发了坏习惯。就代码顺序而言,next()之后没有任何内容 function('/login', (req,res, next) => { User.findOne({ email: username }, (err, user) => {

来自爪哇。在处理ExpressJS时,如果我不添加返回,我会在发送next()后从函数中返回,然后调用next()时,next()函数后的代码仍会执行,目前它可以工作,return会逃避这种行为,但我想知道这是否是正确的方法,还是我开发了坏习惯。就代码顺序而言,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()调用了中间件,这是我的错误中间件。

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

返回
语句是不必要的。首先是因为您没有返回任何内容,其次是因为您正在使用
next
方法将控制权传递给下一个中间件,因此该返回在那里是无用的,并且将返回
未定义的

,首先,您在这里不是下一个对象(双关语)

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

例如:

app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id)
  next()
}, function (req, res, next) {
  res.send('User Info')
})
我建议你读快报

因此,是的,您希望在继续请求之前检查用户是否有效

下面的代码只是解释中间件是如何工作的: 其思想是,一个中间件:函数处理请求,并将控制传递给链中的下一个函数

我假设您的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");
});

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

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

例如:

app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id)
  next()
}, function (req, res, next) {
  res.send('User Info')
})
我建议你读快报

因此,是的,您希望在继续请求之前检查用户是否有效

下面的代码只是解释中间件是如何工作的: 其思想是,一个中间件:函数处理请求,并将控制传递给链中的下一个函数

我假设您的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");
});

你下一步要干什么?我不明白你为什么要从一条路线上回来。在像Spark Framework()这样的Java框架中也不会这样做。现在还不清楚你的目标/问题是什么。至少可以说,从路线返回是非常罕见的。一个
.catch()
在代码中做什么?您使用的是
.findOne()
的回调接口,而不是promise接口。你需要始终如一。要么只使用承诺,要么只使用简单的回调。不能把两者混为一谈。你下一步打算干什么?我不明白你为什么要从一开始就离开一条路线。在像Spark Framework()这样的Java框架中也不会这样做。现在还不清楚你的目标/问题是什么。至少可以说,从路线返回是非常罕见的。一个
.catch()
在代码中做什么?您使用的是
.findOne()
的回调接口,而不是promise接口。你需要始终如一。要么只使用承诺,要么只使用简单的回调。不能将两者混用。嘿,我确实有一个中间件,它只是不包含在代码段中。@TaranjitKang这意味着您没有阅读过express中间件和下一个函数的用法。从您的代码段中,您正在调用下一个,因此问题是您下一个要调用的其他函数是什么?。您在其中调用下一个函数的函数用作中间件。嘿,我有一个中间件,它只是不包括在代码段中。@TaranjitKang这意味着您没有阅读express中间件和下一个函数的用法。从您的代码段中,您正在调用next,因此问题是您下一步要调用的是什么其他函数?。在其中调用next的函数用作中间件。但是,调用next()后的代码仍然运行而不返回值。但是,调用next()后的代码仍然运行而不返回值。