deno需用第三方库解析multipart/form-data和xml:multipart推荐deno.land/x/multipart@v2.1.0,支持字段/文件流式读取;xml推荐deno.land/x/xml@v1.0.2,提供parsestring等api;二者共存时须先完整接收再解析,注意编码与base64处理。

Deno 怎么解析 multipart/form-data
原生 Deno 没有内置 multipart/form-data 解析器,直接读取 Request.body 只会得到原始字节流,不能像 Node.js 的 formidable 或 Express 的 multer 那样自动拆出字段和文件。必须手动解析或借助第三方库。
推荐用 https://deno.land/x/multipart@v2.1.0(当前最稳定、无依赖的纯 TypeScript 实现),它支持表单字段、文件流式读取、边界检测和内存/磁盘双模式缓冲。
-
FormData对象无法从Request直接构造(Deno 1.39+ 尚未实现Request.formData(),调用会抛NotImplementedError) - 不要尝试用
new TextDecoder().decode(await req.arrayBuffer())全量解码——二进制文件(如图片)会损坏,且无法识别分隔 boundary - 若上传大文件,务必设
maxFileSize和maxFields,否则可能 OOM;默认不写磁盘,file.stream()是可消费的ReadableStream
import { parse } from "https://deno.land/x/multipart@v2.1.0/mod.ts";
const handler = async (req: Request) => {
if (req.method !== "POST") return new Response("Method not allowed", { status: 405 });
const form = await parse(req);
const name = form.value("name"); // 字符串字段
const avatar = form.file("avatar"); // File 对象,含 .stream(), .filename, .contentType
if (avatar) {
const file = await Deno.open(`./uploads/${avatar.filename}`, { create: true, write: true });
await avatar.stream().pipeTo(file.writable);
}
return new Response(`Hello ${name}`);
};
Deno 怎么解析 XML
Deno 运行时默认不带 XML 解析器,DOMParser 和 XMLHttpRequest 均不可用(不是浏览器环境)。不能用 new DOMParser().parseFromString(..., "text/xml"),会报 ReferenceError: DOMParser is not defined。
实际可用方案只有两个:用第三方纯 JS 库(推荐 https://deno.land/x/xml@v1.0.2),或调用系统命令(仅限简单场景,不跨平台)。
-
xml库是轻量 SAX + DOM 混合实现,支持异步流式解析(parseStream)和同步树构建(parseString),无外部依赖 - 不支持 XSLT、DTD 或命名空间前缀绑定,复杂企业级 XML(如 SOAP)需额外处理 namespace URI 映射
- 错误处理靠
try/catch,无效 XML 会抛SyntaxError,没有validate: true参数
import { parseString } from "https://deno.land/x/xml@v1.0.2/mod.ts";
const xmlStr = `<root><item id="1">foo</item></root>`;
try {
const doc = parseString(xmlStr);
console.log(doc.root.item.$.id); // "1"
console.log(doc.root.item._); // "foo"
} catch (e) {
console.error("Invalid XML:", e.message);
}
multipart 和 XML 同时出现时要注意什么
常见于 Webhook 场景:前端用 multipart/form-data 提交一个 XML 文件(比如电子发票),后端既要提取文件内容,又要解析其 XML 结构。这时顺序和编码很关键。
- 先完整接收文件流并落地为临时文件或
Uint8Array,再传给 XML 解析器——不能边流式解析 multipart 边喂 XML 解析器,因为 XML 解析需要完整文档或至少可 rewind 的 buffer - XML 文件可能含 BOM 或声明编码(如
<?xml version="1.0" encoding="GBK"?>),xml库默认按 UTF-8 解码,GBK/GB2312 需先用TextDecoder("gbk")转成字符串再传入parseString - 如果 XML 内容本身是 base64 编码的(某些银行接口),需先解码再解析,别漏掉这层










