SvelteKit使用adapter-static构建报错:param_value.startsWith不是函数
问题分析:adapter-static构建时出现TypeError: param_value.startsWith is not a function
问题场景
使用adapter-static构建SvelteKit网站时触发如下错误:
node:internal/event_target:908 process.nextTick(() => { throw err; }); ^ TypeError [Error]: param_value.startsWith is not a function
网站开发环境运行正常,但为动态路由添加entries后,构建失败,问题集中在博客模块:
/blog路由通过+page.server.js的load函数重定向到/blog/page/1:
// /blog/+page.server.js import {redirect} from '@sveltejs/kit'; export function load() { throw redirect(308, '/blog/page/1'); }
/blog/page/[number]路由的+page.server.js配置了entries函数:
// /blog/page/[number]/+page.server.js export let entries = async () => { let data = []; let pageNumbers = await getPageNumbers(); for (let i of pageNumbers) { data.push({ number: i }); } return data; }
日志显示entries返回数据为[ { number: 1 } ],但构建仍失败,完整错误栈如下:
> vite build vite v4.3.9 building SSR bundle for production... ✓ 75 modules transformed. node:internal/event_target:908 process.nextTick(() => { throw err; }); ^ TypeError [Error]: param_value.startsWith is not a function at file:///home/georges/dev/cdm-front/node_modules/@sveltejs/kit/src/exports/index.js:140:22 at String.replace (<anonymous>) at file:///home/georges/dev/cdm-front/node_modules/@sveltejs/kit/src/exports/index.js:131:13 at Array.map (<anonymous>) at resolvePath (file:///home/georges/dev/cdm-front/node_modules/@sveltejs/kit/src/exports/index.js:130:5) at file:///home/georges/dev/cdm-front/node_modules/@sveltejs/kit/src/core/postbuild/analyse.js:148:56 at Array.map (<anonymous>) at analyse (file:///home/georges/dev/cdm-front/node_modules/@sveltejs/kit/src/core/postbuild/analyse.js:148:34) at async MessagePort.<anonymous> (file:///home/georges/dev/cdm-front/node_modules/@sveltejs/kit/src/utils/fork.js:22:16) Emitted 'error' event on Worker instance at: at [kOnErrorMessage] (node:internal/worker:289:10) at [kOnMessage] (node:internal/worker:300:37) at MessagePort.<anonymous> (node:internal/worker:201:57) at [nodejs.internal.kHybridDispatch] (node:internal/event_target:639:20) at exports.emitMessage (node:internal/per_context/messageport:23:28) Node.js v18.1.0
原因分析
错误根源是**entries返回的动态路由参数值不是字符串类型**。SvelteKit的resolvePath函数会尝试调用参数值的startsWith()方法,但如果参数是数字类型(比如你的number: 1),就会触发这个类型错误——数字没有startsWith()方法。
你的getPageNumbers返回的是数字数组,导致entries中number字段为数字类型,不符合SvelteKit对动态路由参数的字符串要求。
解决方案
修改entries函数,将数字类型的参数转为字符串即可:
// /blog/page/[number]/+page.server.js export let entries = async () => { let data = []; let pageNumbers = await getPageNumbers(); for (let i of pageNumbers) { data.push({ number: String(i) // 转为字符串 }); } return data; }
或者直接确保getPageNumbers返回字符串数组,效果一致。
修改后entries返回数据应为[ { number: "1" } ],此时构建即可正常完成。
内容的提问来源于stack exchange,提问作者scriptic
相关产品推荐
相关产品推荐

