mongoose的中间件是不是也指express的中间件?

Does the middleware of mongoose also refer to the middleware of express?

我只是想了解中间件也指的是什么。起初我以为是框架express中使用的功能。尽管现在我觉得它们只是指代介于异步函数之间的函数。

我知道 next() 习惯于从一个中间件移动到下一个是很常见的。 express 和 mongoose 都有相似名称的 next() 调用。我很担心,因为我没有在他们的文档中看到 mongoose 或 express 相互引用。所以这让我相信他们的中间件的上下文只是为了他们自己。

http://mongoosejs.com/docs/middleware.html
http://expressjs.com/en/resources/middleware.html

当结合 express 和 mongoose 时,所有的中间件都排成一行together/concatenated还是分开?

例如together/concatenated
- 在 mongoose 上调用 next() 也会触发 expresses 中间件函数

例如分开
- 猫鼬只有它的中间件 next() 只是移动 pre/post 钩子
- 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

即使 doSomethingdoSomethingElse 都有一个名为 arg 的参数,doSomethingElse 记录到控制台的值是实际传递给该函数的值- - arg 的值限定在它被调用的函数范围内,而不是它周围的范围。

在 Express 中间件中应用的 Mongoose 中间件也是如此(反之亦然):它们只是碰巧共享一个相似的常规参数名称。

作为学习实验,您应该暂时偏离惯例(但不是永远;惯例的存在是有原因的!),在单个文件中将您的 Express 和 Mongoose next 参数命名为其他名称- - expressNextmongooseNext,或许可以帮助您在脑海中区分它们。