next() 没有在 Express、Node.js 和 Angular 学习项目中使用——对吗?

next() is not used in Express, Node.js and Angular learning projects - is it right?

我学习了 2 门 MEAN 课程(MongoDB、Express、Angular、Node.js),它们创建了一个简单的博客,并且在这两门课程中从未使用过 next() 方法。

可以吗? 两个项目都正常工作。

如果没有 next() 方法,我是否必须进一步编写代码,或者我必须开始使用它?

我读到没有 'return next()' 函数可以是 called twice 或类似的东西。

请指教。

router.post('/dashboard', passport.authenticate('jwt', { session: false }),
(req, res) => {

    try {
        let newPost = new Post({
            category: req.body.category,
            title: req.body.title,
            photo: req.body.photo,
            text: req.body.text,
            author: req.body.author,
            date: req.body.date
        });

        Post.addPost(newPost, (err, user) => {
            if (err) {
                res.json({success: false, msg: `Post has not been added. ${err}`})
            } else {
                res.json({success: true, msg: 'Post was added.'})
            }
        })
    } catch (err) {
       const error = (res, error) => {
            res.status(500).json({
                success: false,
                message: error.message ? error.message : error
            })
       }

       console.log('error routes/auth POST', res, error)
    }
})
当您希望继续路由到其他请求处理程序时,

next() 有特定用途。它最常用于中间件。例如,这是一个中间件,它记录传入的请求路径,然后继续路由到可能也匹配此特定请求的其他请求处理程序:

app.use((req, res, next) => {
    console.log(`path=${req.path}, method=${req.method}`);
    next();
});

另一方面,如果您只是编写一个请求处理程序,它只发送一个响应并且不需要继续路由到其他请求处理程序,那么您不需要声明或使用 next 如:

app.get("/greeting", (req, res) => {
    res.send("hi");
});

Do I have to write code further without next() method or I have to start use it?

如果您从来没有想继续路由到其他请求处理程序的任何情况,那么您不需要使用 next()

I have read that without 'return next()' a function can be called twice or something like that.

这不是对 that question and answer 的正确解释。没有很好地说明的一点是,如果您正在使用对 next() 的调用并且您有可以在其余函数运行时执行的代码,那么您将需要一个 return 语句停止执行其余功能。这在 if 语句中最常见,例如:

app.use((req, res, next) => {
    // check for auth and continue routing if authenticated already
    if (req.session && req.session.isAuthenticated) {
        next();
        return;
    }
    res.redirect("/login");
});

在这种情况下,对 next() 的调用允许 Express 继续路由到其他请求处理程序,但不会停止执行此函数的其余部分。为此,您要么必须将此 if 转换为 if/else,要么必须插入 return,如我所示。否则,它会同时调用 next()res.redirect("/login");,这不是您想要的。


P.S。在个人编码风格评论中,我不使用 return next(),因为该编程结构意味着对 next() 的调用有一个有意义的 return 值,而您想要 return .没有有意义的 return 值,事实上,请求处理程序不会关注 returned 值。因此,尽管代码不那么紧凑,但我更喜欢将 return; 放在下一行,而不是暗示这里使用了实际的 return 值。