我只是想了解中间件指的是什么。起初我以为是框架表达式中使用的函数。尽管现在我感觉到它们只是指代介于异步函数之间的函数。
我知道看到 next() 习惯于从一个中间件移动到下一个中间件是很常见的。express和猫鼬都有名称相似的next()调用。我很担心,因为我没有看到猫鼬或表达在他们的文档中相互引用。因此,这让我相信他们的中间件上下文只是为了他们自己。
http://mongoosejs.com/docs/middleware.html http://expressjs.com/en/resources/middleware.html
当将快递与猫鼬组合时,所有的中间件是排在一起/连接在一起还是分开的?
例如,一起/串联
- 在猫鼬上调用 next() 也会触发表达式中间件函数
例如分离 - 猫鼬只有它的中间件 next() 只是移动前/后钩
- Express 也只有它的中间件 next() 只是移动到它支持的中间件函数
简短的回答:它们是分开的。
更长的答案:按照惯例,大多数中间件堆栈实现某种要调用的next
函数,以便继续堆栈并依次调用每个中间件函数。
这是一个范围问题。Express 和 Mongoose 都有自己独立的中间件堆栈,因此next
函数的作用取决于它的调用位置。作为一般经验法则,每个函数(包括用于接受next
参数的回调的匿名函数)都有自己的作用域。
请考虑以下非常简短的示例,其中包含作用域不同但其他方面相同的参数名称:
function doSomething(arg) {
console.log(arg)
function doSomethingElse(arg) {
console.log(arg);
}
doSomethingElse('different');
}
doSomething('original');
// Outputs
// > 'original'
// > 'different
尽管doSomething
和doSomethingElse
都有一个名为arg
的参数,但doSomethingElse
记录到控制台的值是实际传递给该函数的值 -arg
的值作用域为调用它的函数,而不是围绕它的作用域。
对于在 Express 中间件中应用的 Mongoose 中间件(反之亦然)也是如此:它们恰好共享一个相似的常规参数名称。
作为一个学习实验,你应该暂时偏离约定(但不是永远;约定存在是有原因的!)将你的Express和你的猫鼬next
参数命名为一个文件中的其他东西 - 也许是expressNext
和mongooseNext
- 以帮助区分它们在你的脑海中。