为何Deno控制台部署失败,但同脚本在Dash平台运行正常?
迁移Deno脚本至新Deno Deploy平台的修复方案
你的代码在新Deno Deploy平台部署失败,核心原因是新平台不兼容旧的底层HTTP监听API,同时存在异步处理、配置类型错误等问题,以下是修复后的完整代码及修改说明:
关键问题与对应修改
- 新Deno Deploy不再支持
Deno.listen和Deno.serveHttp,必须使用官方推荐的Deno.serveAPI创建HTTP服务 - 不能硬指定端口
8080,平台会自动分配端口 save2MySQL调用未加await,导致异步操作未被正确处理DATABASE_PORT需转为数字类型,原代码直接传入字符串会引发MySQL连接错误
修复后的完整代码
/* eslint-disable */ import "https://deno.land/std@0.181.0/dotenv/load.ts"; import { Client } from "https://deno.land/x/mysql/mod.ts"; // 初始化MySQL客户端,处理端口类型转换 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") ? parseInt(Deno.env.get("DATABASE_PORT")!) : 3306, }); let counter = 0; // 使用Deno.serve适配新平台的HTTP服务API Deno.serve(async (request) => { counter++; const url = new URL(request.url); switch (url.pathname) { case "/": { const sentence = url.searchParams.get("sentence"); // 等待数据库操作完成,避免Promise未处理 const sqlStatus = await save2MySQL(sentence); console.log(sqlStatus); return new Response("Data processed", { status: 200 }); } default: return new Response(counter.toString(), { status: 200 }); } }); async function save2MySQL(sentence: string | null) { console.log("Attempting to save data to the database"); if (!sentence) { return "No sentence provided"; } // 补充实际数据库插入逻辑(替换为你的表名) const result = await client.execute( "INSERT INTO your_table (sentence) VALUES (?)", [sentence] ); return `Saved successfully, affected rows: ${result.affectedRows}`; }
部署额外注意事项
- 在Deno Deploy控制台确认
DATABASE_HOST、DATABASE_USER、DATABASE_NAME、DATABASE_PASS、DATABASE_PORT等环境变量已正确配置 - 确保你的MySQL数据库允许Deno Deploy的IP段访问(云数据库需在安全组中添加平台出站IP)
- 入口文件设置为
main-esm.ts后,可手动推送一次代码到GitHub触发重新部署
内容的提问来源于stack exchange,提问作者anjanesh
相关产品推荐
相关产品推荐

