Nuxt SSR DEV 模式:proxyRequest 不适用于节点 19+(适用于 18)

问题描述 投票:0回答:1

我的 Nuxt 3 应用程序中的这个包罗万象的服务器中间件可与 Node 18 配合使用:

服务器/api/[...].ts

import { joinURL } from 'ufo';
export default defineEventHandler((event) => {
    const config = useRuntimeConfig();
    const path = event.path.replace(/^\/api\//, '');
    const target = joinURL(config.backendUrl, path);
    console.log('Proxy -->', target);
    return proxyRequest(event, target);
});

但是当我使用 Node 19.0.0 或更高版本时,console.log 会被执行,但 web 应用程序不再加载

proxyRequest(event, target);
替换为
return event;
即可解决问题。

这种情况仅发生在 DEV 模式下。生产构建有效。 有什么想法吗? 🤔

更新:使用 Node 19+ 的服务器中间件的最小复制按预期工作,因此它一定是应用程序中的其他内容。这是我的 nuxt 配置:

import svgLoader from 'vite-svg-loader';
import type { ConsentType } from './composables/useConsentControl';
import { ENV } from './constants/environments';

const autoImportDirs = ['constants', 'stores'];

export default defineNuxtConfig({
    telemetry: false,
    experimental: {
        // https://github.com/nuxt/nuxt/pull/23725
        defaults: {
            useAsyncData: {
                deep: false,
            },
        },
    },
    components: [
        {
            path: '~/components',
            pathPrefix: false,
        },
    ],
    nitro: {
        imports: {
            dirs: autoImportDirs,
        },
        compressPublicAssets: {
            gzip: true,
            brotli: true,
        },
    },
    imports: {
        dirs: autoImportDirs,
    },
    vite: {
        plugins: [
            svgLoader({
                defaultImport: 'url',
            }),
        ],
    },
    css: ['@/assets/styles/main.scss'],
    devtools: { enabled: process.env.NUXT_PUBLIC_ENVIRONMENT !== ENV.PRODUCTION },
    modules: ['@vueuse/nuxt', '@pinia/nuxt', 'nuxt-jsonld', '@nuxt/image', '@zadigetvoltaire/nuxt-gtm', '@dargmuesli/nuxt-cookie-control'],
    pinia: {
        storesDirs: ['./stores/**', './ranking/**'],
    },
    image: {
        domains: ['https://static.ecommercedb.com'],
    },
    runtimeConfig: {
       baseUrl: process.env.NUXT_BASE_URL,
       // and many other env vars
    },
    public: {
       // many env vars
    },
},
}
node.js nuxt.js
1个回答
0
投票

所以我们找到了罪魁祸首:

此外,代理现在能够解析服务器可能发送的响应 Keep-Alive。该标头指示客户端保持连接的时间。另一方面,当调用 close() 时,Node.js HTTP 服务器现在将自动断开空闲客户端(使用 HTTP Keep-Alive 来重用连接)。

https://nodejs.org/en/blog/announcements/v19-release-announce

我正在使用 Axios,由于某种原因,对代理的请求包含以下标头:

 connection: 'close'

覆盖它以“保持活动”解决了问题✅

© www.soinside.com 2019 - 2024. All rights reserved.