vike-photon 使用要点: PhotonRuntimeError Server entry default export must include a 'fetch' method 报错解决实战
我开发的 press 应用是使用 vike 框架与 vike-server库构建的。但最近 vike 团队选择了新的 vike-photon 库来运行服务端代码,停止了原来 vike server 库的开发。
我就尝试移植 vike-server 库的代码到 vike-photon 库。但代码移植完成后进行时报了如下错误无法正常启动了:
PhotonRuntimeError: [photon][Runtime Error] Server entry default export must include a 'fetch' method
多次检查代码并没有发现明显的错误,移植所需要修改的代码也非常少。最终只得尝试创建一个全新的 vike-photon 项目代码来一步一步地移植进行调试。最终我发现了原来的代码返回的服务启动函数是一个 Promise 函数,而全新的 vike-photon 项目代码则为一个正常函数:
// +config.ts
export { config }
import vikePhoton from 'vike-photon/config'
const config = {
// https://vike.dev/extends
extends: [vikePhoton],
photon : {
server: 'express-entry.ts',
standalone: true
}
}
// express-entry.ts
import "dotenv/config";
import { dbMiddleware } from "./db-middleware";
import { apply, serve } from "@photonjs/express";
import express from "express";
const port = process.env.PORT ? parseInt(process.env.PORT, 10) : 3000;
export default startApp() as unknown;
async function startApp() {
const app = express();
apply(app, [
// Make database available in Context as `context.db`
dbMiddleware,
// Some handler,
]);
// Other code used await.
return serve(app, {
port,
});
}
移除 async 并且在函数中不使用 await 调用其他相关函数后,移植后的代码成功运行了。
最终我学到了如下 vike-photon 的关键用法:服务入口默认导出函数不能是一个 Promise 函数。
24