3

我试图从 serverMiddleware 访问 Nuxt 运行时变量

示例我有这个context.$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) {
    }

无论如何可以从那里访问context.$db吗?IE

    export default function(res, req) {
        $config.db = null
    }
4

2 回答 2

0

对于静态数据,我通常使用环境变量 (.env)或在 nuxt.config.js 中声明的模块来传递数据。

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

请参阅以下链接/图表了解 serverMiddle 生命周期:

了解 Nuxt.js 配置中的模块、serverMiddleware 和插件

于 2020-12-31T07:42:16.097 回答
0

所以我不是 100% 精通Nuxt 生命周期(v2.x),但是你不能在 serverMiddleware 生命周期阶段访问 Nuxt 应用程序上下文。 serverMiddleware是真正connect基于的(由 Express 内部使用,顺便说一句),用于处理reqres参数next,代表请求、响应,并且nextconnect流管理参数。

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

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

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

服务器中间件与中间件!

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

不要添加serverMiddleware到 middleware/ 目录。

中间件,由 webpack 捆绑到您的生产包中,并在 beforeRouteEnter 上运行。如果你添加serverMiddleware到 middleware/ 目录,Nuxt 会错误地选择它,middleware并且会在你的包中添加错误的依赖项或生成错误。

顺便说一句,与往常一样,如果我对上述任何一项都不正确,我总是感谢 Stackflow 用户指出错误或可以更好地解释

于 2021-08-06T18:05:44.277 回答