SvelteKit Adapter-node自定义Express服务器的CORS与模块缺失问题
SvelteKit迁移自定义Express服务器问题排查与解决
核心错误:同时启动两个服务器的逻辑冲突
你同时运行Vite开发服务器(5173端口)和自定义Express服务器(3000端口)是根本问题:
- 前端页面在5173端口,fetch请求指向3000端口必然触发CORS跨域错误;
- 自定义服务器依赖
build/handler.js,但npm run dev是开发模式,不会生成build目录,所以控制台会提示找不到模块文件。
自定义Express服务器的正确使用姿势
开发阶段
不需要单独启动自定义Express服务器,SvelteKit的dev模式本身支持集成自定义逻辑:
- 将原Express的自定义路由、中间件,迁移到SvelteKit的
src/routes/api/目录(server routes),或通过src/hooks.server.js处理全局请求; - 若必须用Express中间件,可在
svelte.config.js中通过adapter-node配置serverMiddleware注入,直接用npm run dev启动即可。
生产阶段
必须先完成构建,再启动自定义服务器:
- 执行
npm run build生成完整的build目录; - 确保自定义服务器文件(
myserver.js)正确导入build/handler.js; - 修正
package.json的启动脚本:你写的是"start": "node ./server",但服务器文件是myserver.js,应改为"start": "node ./myserver.js"。
CORS问题快速解决
- 开发阶段:在
svelte.config.js的kit配置中添加cors: true,允许跨域请求; - 生产阶段:在自定义Express服务器中引入
cors中间件(需先安装npm i cors),或确保前端页面与API请求使用同一端口。
Sapper到SvelteKit的迁移简化流程
- 创建SvelteKit项目并配置adapter-node;
- 将原Express的业务路由、中间件,迁移为SvelteKit的server routes或hooks;
- 开发时仅用
npm run dev启动,无需单独启动Express; - 生产时先构建再通过自定义服务器启动。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

