如何获取通过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...' } ] }