网站搜索

Next.js TypeScript 与 Cloudflare Pages 功能


我已经创建了一个使用 TypeScript 的最小化 Next.js 应用,并创建了一个 functions 文件夹,其中包含以下 API:

import { jsonResponse } from "../utils/jsonResponse";

export const onRequestGet: PagesFunction<{ FILES: KVNamespace }> = async ({ request, env }) => {
    return jsonResponse({
        time: new Date(),
    });
};

PagesFunction 类型是从示例图片应用复制的: https://github.com/cloudflare/images.pages.dev/blob/main/functions/types.d.ts

jsonResponse 工具函数来自同一个示例应用。

在 Cloudflare 上构建时,并且在本地使用 npx wrangler pages dev ./out 验证时,我得到了以下错误:

Error: Transform failed with 1 error:
<stdin>:3:25: error: Expected ";" but found ":"
    at failureErrorWithLog (/Users/martinnormark/.npm/_npx/8c55f4bc76fffd7b/node_modules/esbuild/lib/main.js:1475:15)
    at /Users/martinnormark/.npm/_npx/8c55f4bc76fffd7b/node_modules/esbuild/lib/main.js:1264:29
    at /Users/martinnormark/.npm/_npx/8c55f4bc76fffd7b/node_modules/esbuild/lib/main.js:611:9
    at handleIncomingPacket (/Users/martinnormark/.npm/_npx/8c55f4bc76fffd7b/node_modules/esbuild/lib/main.js:708:9)
    at Socket.readFromStdout (/Users/martinnormark/.npm/_npx/8c55f4bc76fffd7b/node_modules/esbuild/lib/main.js:578:7)
    at Socket.emit (node:events:390:28)
    at addChunk (node:internal/streams/readable:315:12)
    at readableAddChunk (node:internal/streams/readable:289:9)
    at Socket.Readable.push (node:internal/streams/readable:228:10)
    at Pipe.onStreamRead (node:internal/stream_base_commons:199:23) {
  errors: [
    {
      detail: undefined,
      location: {
        column: 25,
        file: '<stdin>',
        length: 1,
        line: 3,
        lineText: 'export const onRequestGet: PagesFunction<{ FILES: KVNamespace }> = async ({ request, env }) => {',
        namespace: '',
        suggestion: ''
      },
      notes: [],
      pluginName: '',
      text: 'Expected ";" but found ":"'
    }
  ],
  warnings: []
}

如果我删除 PagesFunction<> 和参数(在这个例子中我没有使用),它就能正常工作。

但这只是一个最小示例,在这里我没有使用 EventContext 中的任何内容。我有一些 API 需要通过 env.FILES 参数访问 KV 命名空间。

例如这个:

import { jsonResponse } from "../utils/jsonResponse";
import { Magic } from "@magic-sdk/admin";

// Initiating Magic instance for server-side methods
const magic = new Magic(process.env.MAGIC_SECRET_KEY);

export const onRequestPost = async (context: any) => {
    try {
        const req: Request = context.request;
        const didToken = req.headers.get("Authorization")?.substr(7);
        await magic.token.validate(didToken!);

        return jsonResponse({
            authenticated: true,
        });
    } catch (error: any) {
        return jsonResponse(
            { error: error.message },
            {
                status: 500,
            }
        );
    }
};

结果发现类型注解 context: any 不被喜欢。

这似乎与 functions 文件夹被放在 Next.js 应用程序内部有关。我尝试使用 React TS 模板构建一个 Vite 应用,并且运行良好。代码在这里:https://github.com/martinnormark/reactts-cf-pages-functions