NodeJS Oak / Deno,如何读取具有数组的多部分表单

tyky79it  于 2023-10-17  发布在  Node.js
关注(0)|答案(2)|浏览(119)

这不起作用,因为我的表单有字符串和数组
在Deno / Oak中,我无法返回选中的复选框数组(表单编码是多部分的)

const body = await ctx.request.body({type: 'form-data'})
const formData: Record<string, string> = (await body.value.read()).fields

输出如下:

{
  fields: {
    title: "nn",
    author: "6516425a77906b55577811b0",
    summary: "nn",
    isbn: "nn",
    genre: "652077b1a36908a518ed91b4"
  }
}

这里,表单编码是URLencoded

const body = await ctx.request.body({type: 'form'}).value

输出是这样的(这似乎更有希望!),

URLSearchParams {
  [Symbol(list)]: [
    [ "title", "n" ],
    [ "author", "6516425a77906b55577811b0" ],
    [ "summary", "n" ],
    [ "isbn", "n" ],
    [ "genre", "6516425a77906b55577811aa" ],
    [ "genre", "6520455aaca724f1c8ac090b" ],
    [ "genre", "652077b1a36908a518ed91b4" ],
    [ "genre", "65207a7e57543b963db0f29f" ]
  ],
  [Symbol("url object")]: null,
  [Symbol("[[webidl.brand]]")]: Symbol("[[webidl.brand]]")
}

使用相同的pug模板,我在Node / Express中所做的就是:

req.body

它的工作原理是简单的,返回的复选框作为一个数组。
输出是这样的(正是我需要的)!

{
  title: 'nn',
  author: '6516425a77906b55577811b0',
  summary: 'nn',
  isbn: 'nn',
  genre: [
    '6516425a77906b55577811aa',
    '6520455aaca724f1c8ac090b',
    '652077b1a36908a518ed91b4',
    '65207bb95ede58c78b1b68c7',
    '65215c985e4f1575c1aef29b'
  ]
}

我需要的橡树输出看起来像这样的工作与它
不确定,如果不能实现这样简单的功能,我是否应该撤销我最后两周的Deno / Oak编码,回到Node。Deno / Oak的意思是更新和更好的权利?

z18hc3ub

z18hc3ub1#

要从URLSearchParams访问作为数组的genre,必须使用URLSearchParams.getAll()

const genres = body.getAll('genre');
/*
["6516425a77906b55577811aa",
"6520455aaca724f1c8ac090b",
"652077b1a36908a518ed91b4",
"65207a7e57543b963db0f29f"]
*/
rryofs0p

rryofs0p2#

谢谢!我知道getAll。只是我需要在一次调用中获得一个对象中的所有表单数据,就像我现在在Express中所做的那样,因为我并不总是知道会有多少字段,或者字段的名称。它也更灵活。如果数据是express liek格式(作为键值字典,其中值可以是数组),我可以将键/值对象传递给验证函数,然后该函数可以解析和修剪所有数据(检测每个键的值是否是数组,因此它可以处理这些情况)。看起来我需要写一个自定义函数来实现这一点,因为它并没有真正内置到Oak中。

相关问题