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 值。
我学习了 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 值。