使用Deno Deploy部署时报Deno.stat is not a function错误如何解决
问题原因
你代码的报错核心是Deno Deploy 运行环境不支持直接访问传统本地文件系统:你本地用deployctl运行时可以读取本地磁盘的public目录,但部署到Deno Deploy后,平台默认不会将项目静态目录挂载到运行时可访问的文件路径下,同时你用Deno.cwd()拼接路径的写法也和Deno Deploy的运行时工作目录结构不兼容,自然会出现找不到文件的错误。
修复步骤
- 首先在项目根目录新增/编辑
deno.json文件,通过include字段声明需要打包到部署环境的静态资源路径:
{ "include": [ "**/*.ts", "public/**/*" ] }
- 修改你的服务代码,去掉
Deno.cwd()路径拼接,直接使用相对路径指定静态资源根目录,如果你用oak框架的context.send,修改后代码如下:
import { Application } from "./deps.ts"; const app = new Application(); // 静态资源服务 app.use(async (context) => { await context.send({ root: "./public", index: "index.html", }); }); addEventListener("fetch", app.fetchEventHandler());
如果上述方案依然有问题,也可以改用Deno标准库的serveDir实现静态服务,兼容性更强:
import { Application, Context } from "./deps.ts"; // serveDir来自Deno标准库http模块,已提前导入到deps.ts中 import { serveDir } from "./deps.ts"; const app = new Application(); app.use(async (ctx: Context) => { ctx.response = await serveDir(ctx.request, { fsRoot: "./public", index: "index.html" }); }); addEventListener("fetch", app.fetchEventHandler());
本地验证方法
修改完代码后,本地运行时添加--include参数指定要包含的静态目录,即可模拟部署后的运行行为:deployctl run --include=public 你的入口文件名.ts
内容的提问来源于stack exchange,提问作者Andrew Heaney
相关产品推荐
相关产品推荐

