如何获取通过sails.js中的窗体发送的数组/对象(使用enctype multipart / form-data)
我在我的表格中嵌套信息以匹配我的模型,这大大简化了后端的事情,但我无法find如何在Sails.js中获取数组或对象(或两者的组合)
假设我有这样的表单
注意:完全需要支持“multipart / form-data”。
<form action="/articles" method="post" enctype="multipart/form-data"> <input type="file" name="status" value="published"> <!-- Entry 0 --> <input(type="text" name="entries[0][title]" value="Entry 1") <input(type="text" name="entries[0][content]" value="Entry 1 Content...") <!-- Entry 1 --> <input(type="text" name="entries[1][title]" value="Entry 2") <input(type="text" name="entries[1][content]" value="Entry 2 Content...") <!-- images --> <input type="file" name="images[]"> <input type="file" name="images[]"> </form>
我期待在req.params.all()obj中得到这样的对象
{ status: 'published', entries: [ {title: 'Entry 1', content: 'Entry 1 Content...'}, {title: 'Entry 2', content: 'Entry 2 Content...'} ] }
现在当调用req.params.all()
/ req.body
我得到的是:
{ status: 'published', 'entries[0][title]': 'Entry 1' 'entries[0][content]': 'Entry 1 Content...' 'entries[1][title]': 'Entry 2' 'entries[1][content]': 'Entry 2 Content...' 'entries[0][title]': 'Entry 1' }
调用req.file('images[]')
给出了正确的行为。 我正在检查该fn返回的._files
属性,并在那里显示我的2个图像。 在这里使用括号似乎很奇怪,但就是这样。
我想这与我得到的req.params.all()有关,我可以进一步parsing这个,但是如果将来有什么变化的话,它会变得笨拙和脆弱。 在任何情况下,这是任何Web应用程序的常见模式,并支持许多语言和框架,所以对我来说真是奇怪,似乎不可能得到我所需要的只是简单的sails.jsfunction,所以我猜我我没有做任何事情,或者我失去了一些东西。 请指出正确的方向,如果Sails实际上不支持这种基本的嵌套行为,那么我应该怎么做呢?
通过Javascript发送原始内容不是一个选项(除非是不可能的,否则)在这个问题的第三个答案build议: 是否有可能在Sailsjsbuild立更复杂的模型这样做,至less对于我所得到的文本字段正确的输出,不确定与图像,因为我已经通过邮递员testingrawdata。
编辑:到目前为止,我已经尝试改变configuration/ http.js像这样的船长身体分析器:
bodyParser: { fn: require('body-parser').urlencoded, options: {extended:true} }
但是,这使得我的服务器无用,它开始了,但它没有回应任何请求,不知道为什么(即使用他们的例子与船长,你只需要取消注释,不起作用)。
由于队长是基于bodyparser,我修改了skipper模块index.js来testing发生了什么。
var URLEncodedBodyParser = connect.urlencoded({extended:true})
但是它不起作用,我得到了与开始相同的结果,即使安装body-parser并使用它,而不是connect.urlencoded身体分析器没有效果。
编辑2:由于@robertklep声明使用表单数据没有多部分作品,但当然我失去了上传文件的能力,这是非常重要的,我把它放在例子forms的原因。
编辑3:只是为了补充接受的答案,以防有人需要,这就是我所做的:
在config/http.js
middleware: { order: [ // some middleware 'bodyParser', 'qsBodyParser', // more middleware ], qsBodyParser: require('../api/middleware/qsBodyParser') }
并在api/middleware/qsBodyParser
Qs = require('qs'); qsBodyParser = function(req, res, next) { if req.is('multipart/form-data'){ req.body = Qs.parse(req.body); } return next(); }; module.exports = qsBodyParser;
skipper
的正确版本取决于connect@2.25.0
,这取决于body-parser@1.6.0
,它不处理你发送表单数组/对象的方式。
你的表单例子是这样的(使用extended : true
):
{ "entries" : [{ "content" : "Entry 1 Content..." }, { "content" : "Entry 2 Content..." }] }
最新版本( body-parser@1.13.3
)按预期工作,所以你必须以某种方式将其插入skipper
。
编辑 : 这个评论似乎表明,使用multipart/form-data
将完全禁用数组(/对象?)parsing。
编辑#2 :你可以手动parsingreq.body
使用qs
,这似乎接受一个对象作为参数:
var qs = require('qs'); var obj = qs.parse({ status: 'published', 'entries[0][title]': 'Entry 1', 'entries[0][content]': 'Entry 1 Content...', 'entries[1][title]': 'Entry 2', 'entries[1][content]': 'Entry 2 Content...', }); // obj is now: // { status: 'published', // entries: // [ { title: 'Entry 1', content: 'Entry 1 Content...' }, // { title: 'Entry 2', content: 'Entry 2 Content...' } ] }