【问题标题】:How to access form body in oak/deno如何在 Oak/deno 中访问表单主体
【发布时间】:2020-06-13 17:56:38
【问题描述】:

我正在使用橡木/deno。我有一个从提供的 ejs 文件提交的表单。如何访问表单正文?当我将它记录到控制台时,它会打印:{type: "form", value: URLSearchParamsImpl {} }

后处理程序如下所示:

router.post("/add", async (ctx: RouterContext) => {
  const body = (await ctx.request.body())
  console.log(body)
  ctx.response.redirect("/");
});

【问题讨论】:

    标签: deno oak


    【解决方案1】:

    如果您要发送x-www-form-urlencoded,只需使用body.value 中的URLSearchParams 实例即可。

    body.value.get('yourFieldName')
    

    如果body.type === "form-data",您可以使用.value.read(),您将获得multipart/form-data 字段

    router.post("/add", async (ctx: RouterContext) => {
      const body = await ctx.request.body({ type: 'form-data '});
      const formData = await body.value.read();
      console.log(formData.fields);
      ctx.response.redirect("/");
    });
    

    【讨论】:

    • 这可以正常工作并允许访问表单数据,但是示例中提到了multipart/form 数据。如何访问这些文件?
    【解决方案2】:

    类似这样的东西返回值

    看起来body.value 是通过.get(<key>) 访问的,或者可以使用.entries()Object.fromEntries() 进行迭代

    async register(context: RouterContext) {
      const body = context.request.body({ type: 'form' })
      const value = await body.value
    
      console.log(value.get('email'))
    
      for (const [key, val] of value.entries()) {
        console.log(key, val)
      }
    
      const args = Object.fromEntries(value)
      console.log(args)
    
      context.response.body = 'test'
    }
    

    【讨论】:

    • edit 回答您的问题,包括解释它是如何工作的以及为什么它可以解决问题中描述的问题。见How to Answer
    • 谢谢,结果很好!我使用的是 json body,所以我的代码有点不同:const body = ctx.request.body({ type: 'json' }); const parsedBody = await body.value;
    猜你喜欢
    • 2020-09-29
    • 2020-09-30
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2022-11-10
    相关资源
    最近更新 更多