我的 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
},
},
}
所以我们找到了罪魁祸首:
此外,代理现在能够解析服务器可能发送的响应 Keep-Alive。该标头指示客户端保持连接的时间。另一方面,当调用 close() 时,Node.js HTTP 服务器现在将自动断开空闲客户端(使用 HTTP Keep-Alive 来重用连接)。
https://nodejs.org/en/blog/announcements/v19-release-announce
我正在使用 Axios,由于某种原因,对代理的请求包含以下标头:
connection: 'close'
覆盖它以“保持活动”解决了问题✅