尴尬,用deno std 的http模块,不知道如何获取post请求提交的数据……

测试代码:

import { serve } from "../deno_std/http/server.ts";
const server = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of server) {
    console.log(await req.body.read(1));
    req.respond({ body: "Hello World\n" });
}

提交post请求后,调用req.body.read(len)时,会得到下面错误:

error: Uncaught (in promise) TypeError: buf.subarray is not a function
      const readBuf = buf.subarray(0, remaining);
^
    at Object.read (https://deno.land/std@0.91.0/http/_io.ts:28:1)

搜了一圈好像没找到相关的文档和 issues

查看std各个模块的源码,找到方法了

使用io模块下util.ts 的readAll函数读取req.body的数据,得到一个Uint8Array对象,通过new TextDecoder().decode()方法转换为字符串。得到的字符串是json格式数据,可以再转换为js对象去操作。

全部代码:

import { readAll } from "../deno_std/io/util.ts";
import { serve } from "../deno_std/http/server.ts";
const server = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of server) {
const buf = await readAll(req.body);
const post_data = new TextDecoder().decode(buf);
console.log(post_data);
req.respond({ body: "Hello World\n" });
}

建议可以看看oak 这个项目,我写服务就是用的这个 :blush:

原本就是用oak的,后来改成用官方的http模块了