gpt4 book ai didi

node.js - Express/Connect 中间件如何工作?

转载 作者:搜寻专家 更新时间:2023-11-01 00:12:08 28 4
gpt4 key购买 nike

我正在学习 Node.js,并且阅读了一些教程,例如用于学习核心功能的 Node 初学者手册。但是我越读一些例子,我开始收集的疑惑就越多。

在从教程中获得的进一步示例中,我们可以看到对于键 /documents/titles.json 的 CRUD“读取”请求,我们返回一个值:

app.get('/documents/titles.json', loadUser, function(req, res) {
Document.find({ user_id: req.currentUser.id },[], { sort: ['title', 'descending'] },
function(err, documents) {
res.send(documents.map(function(d) {
return { title: d.title, id: d._id };
}));
});
});

在此示例中,函数 loaduser() 用于身份验证目的:

function loadUser(req, res, next) {
if (req.session.user_id) {
User.findById(req.session.user_id, function(err, user) {
if (user) {
req.currentUser = user;
next();
} else {
res.redirect('/sessions/new');
}
});
}
}

我不明白的是:

  1. 我想 node.js 在开始执行 app.get 之前,会进入 loaduser 函数。 loadUser() 函数具有三个参数:req、res、next,但我至少没有看到您如何从 app.get() 传递“req "loadUser() 的参数。它从哪里来?
  2. loadUser()函数中,当你执行next()时,意味着app.get()函数可以继续它的过程,但是这个 req.currentUser = user,与 app.get() 函数中使用的请求相同吗?
  3. loadUser() 函数中,当您执行 res.redirect() 代码时,会自动中断 app.get() 上的过程函数对吧?看起来它没有返回到 Document.find()

最佳答案

您提出的问题是关于 Express 的框架内部具体:

  1. 当您调用 app.get(route, loadUser, final) 时,Express 将创建一个包含 loadUser 和 final 函数的堆栈(数组),它会知道当您调用 next 时,它应该执行以下函数具有相同 req 和 res 参数的堆栈。

  2. 当您调用 next 时,它只会传递给中间件堆栈中的下一个函数。

  3. 由于您调用了 res.redirect 而没有调用 return,它不会传递到堆栈中的下一个函数(带有 Document.find 的函数)。

资源:

http://howtonode.org/getting-started-with-express

关于node.js - Express/Connect 中间件如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10881656/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com