我想问一个关于node.js
文件中代码顺序的问题。
我从Udemy课程中获得了以下有关使用passport.js
进行用户身份验证的代码。
// CREATE - add new campgrounds to DB
router.post("/", isLoggedIn, function(req, res) {
// get data from form and add to campgrounds array
var name = req.body.name;
var image = req.body.image;
var desc = req.body.description;
var author = {
id: req.user._id,
username: req.user.username
}
var newCampground = {name: name, image: image, description: desc, author:author}
// Create a new campground and save to database
Campground.create(newCampground, function(err, newlyCreated) {
if(err) {
console.log(err);
}
else {
console.log(newlyCreated)
res.redirect("/campgrounds")
}
})
// redirect as a GET request
})
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect("/login");
}
我在这里有点困惑。我在上面的路由之后定义了函数isLoggedIn
,并使用中间件确定是否应在该行中执行以下代码
router.post("/", isLoggedIn, function(req, res) {
这与我学习的其他语言(包括HTML和Python)的原则背道而驰,其中必须在使用之前明确定义所使用的任何代码,包括电子表格和变量。
即使在我的isLoggedIn
POST路由之后声明了函数router.post
,为什么代码仍能起作用?
答案 0 :(得分:1)
JavaScript中悬挂了函数声明,因此它们被移至其作用域的顶部,这就是为什么您可以毫无问题地使用它们的原因。
您可以在此处阅读有关吊装的更多信息: https://developer.mozilla.org/en-US/docs/Glossary/Hoisting
答案 1 :(得分:1)
这是由于javascript中的“吊装”所致。
“提升是一种JavaScript机制,其中变量和函数声明在代码执行之前移至其作用域的顶部。这不可避免地意味着,无论在何处声明函数和变量,都将其移至其作用域的顶部。他们的范围是全球范围还是本地范围。”
https://scotch.io/tutorials/understanding-hoisting-in-javascript