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

Top articles