为什么在Deno控制台里我的构建仍然失败,即使Deno Dash一切都正常?

后端开发 2026-07-10

我的一个简单的Deno脚本在dash.deno.com上运行正常。

/* eslint-disable */
import "https://deno.land/[email protected]/dotenv/load.ts";

import { Client } from "https://deno.land/x/mysql/mod.ts";
const client = await new Client().connect({
    hostname: Deno.env.get("DATABASE_HOST"),
    username: Deno.env.get("DATABASE_USER"),
    db: Deno.env.get("DATABASE_NAME"),
    password: Deno.env.get("DATABASE_PASS"),
    port: Deno.env.get("DATABASE_PORT"),
  });

const server = Deno.listen({ port: 8080 });
console.log(`HTTP webserver running. Access it at:  http://localhost:8080/`);

let counter  = 0;

for await (const conn of server)
{
    serveHttp(conn);
}

async function serveHttp(conn: Deno.Conn)
{
    const httpConn = Deno.serveHttp(conn);
    for await (const requestEvent of httpConn)
    {
        counter++;        
        const url = new URL(requestEvent.request.url);

        switch (url.pathname)
        {
            case "/":
            {
                const sentence = url.searchParams.get("sentence");
                const sqlStatus = save2MySQL(sentence);
                console.log(sqlStatus);
                break;
            }

            default:
                requestEvent.respondWith(new Response(counter as unknown as string, { status: 200, }),);
        }
    }
}

async function save2MySQL(sentence: string)
{
    console.log("Attempting to save data to the datbase");
    // ...    
    return result;
}

但Deno Deploy Classic将于2026年 7月 20日关闭,他们正在迁移到新的Deno Deploy平台。

因此我尝试部署相同的GitHub URL(只有一个main-esm.ts文件)——我在deno控制台设置里把Entrypoint设置为main-esm.ts。

但Deploy总是失败——我似乎无法把这个简单的单文件Deno脚本从dash迁移到控制台。

控制台部署截图

解决方案

看起来是一个版本兼容性问题。

Deno.listen() + Deno.serveHttp() 是新Deploy不再支持的旧版底层HTTP API。Deno.serveHttp 在Deno 1.35版本中被弃用,后续版本中被移除。

另请参阅: https://docs.deno.com/deploy/migration_guide/

Deno.serve({ port: 8080 }, async (req: Request): Promise<Response> =>
{
    console.log(`HTTP webserver running. Access it at:  http://localhost:8080/`);

    counter++;
    const url = new URL(req.url);

    switch (url.pathname)
    {
        case "/":
        {
            const sentence = url.searchParams.get("sentence");
            const sqlStatus = save2MySQL(sentence);
            console.log(sqlStatus);
            return new Response("OK", { status: 200 });               
            break;
        }

        default:
            return new Response(String(counter), { status: 200 });
    }
});
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章