serverMiddleware访问Nuxt实例或上下文



im试图从服务器中间件访问Nuxt运行时变量

例如,我有一个上下文$db我从这个插件中添加的

nuxt.config.js


plugins: [
{ src: '~/plugins/db_runtime.js', mode: 'server' }
]

~/plugins/db_runtime.js:


db = 'test'

export default ({ app }, inject) => {
inject('db', db)
}

然后我添加了一个服务器中间件:


serverMiddleware: [
{ path: '/api', handler: '~/api/index.js' },
],

服务器中间件:~/api/index.js:


export default function(res, req) {
}

是否存在访问上下文的权限$数据库?即

export default function(res, req) {
$config.db = null
}
对于静态数据,我通常使用环境变量(.env(或nuxt.config.js中声明的模块来传递数据。

对于动态数据,由于serverMiddleware总是在nuxt应用程序的同一生命周期中调用,因此您可以使用asyncData((或fetch((或axios 安全地将数据作为HTTP请求发送

服务器中间生命周期请参考以下链接/图表:

了解Nuxt.js配置中的模块、服务器中间件和插件

所以我不是100%精通Nuxt生命周期(v2.x(,但在服务器中间件生命周期阶段,你可能无法访问Nuxt应用程序上下文。serverMiddleware实际上是基于connect的(由Express、btw内部使用(,用于处理reqresnext参数,这些参数表示请求、响应,而nextconnect的流管理参数。

基本的概念原因是Nuxt应用程序上下文同时支持服务器和客户端,默认的"通用"模式是Nuxt的核心目标。connect实际上是一个仅用于服务器端的库,旨在处理应用程序服务器的请求和响应特性。

由于您需要config.$db,只要您需要的配置值是静态的,那么可能有另一种方法可以使用nuxt.configenvserverMiddleware中的常规环境变量。$config是一个较新的Nuxt构造,旨在允许更灵活的运行时环境变量(以及正常的env-var(。

以下是Nuxt提供的middlewareserverMiddleware解释的当前2.x链接。我还剪切/粘贴了文本信息,以防Nuxt上的链接衰减。

服务器中间件vs中间件

不要将其与客户端或SSR中Vue在每条路由之前调用的路由middleware混淆。serverMiddleware属性中列出的中间件在vue-server-renderer之前运行在服务器端,可用于特定于服务器的任务,如处理API请求或服务资产。

不要将serverMiddleware添加到中间件/目录中。

中间件由webpack捆绑到您的生产捆绑包中,并在beforeRouteEnter上运行。如果将serverMiddleware添加到中间件/目录,Nuxt将错误地将其作为middleware,并将错误的依赖项添加到捆绑包中或生成错误。

Btw,一如既往,如果我在上述任何一项上都不正确,我总是感谢Stackflow用户指出错误之处或可以更好地解释

最新更新