Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:基于FormData值设置多目标_Javascript_Node.js_Express_Xmlhttprequest_Multer - Fatal编程技术网

Javascript Node.js:基于FormData值设置多目标

Javascript Node.js:基于FormData值设置多目标,javascript,node.js,express,xmlhttprequest,multer,Javascript,Node.js,Express,Xmlhttprequest,Multer,我正在创建一个XMLHttpRequest(xhr),它将一个FormData对象发送到Node.js(Express)服务器,该对象包含一个文件和一些值。我正在使用Multer,因为我不能将bodyParser与multipart数据一起使用 router.post("/submit", function(req, res) { var storage = multer.diskStorage({ // set destination here })

我正在创建一个
XMLHttpRequest
xhr
),它将一个
FormData
对象发送到
Node.js
Express
)服务器,该对象包含一个文件和一些值。我正在使用
Multer
,因为我不能将
bodyParser
multipart
数据一起使用

router.post("/submit", function(req, res) {
    var storage = multer.diskStorage({
        // set destination here
    })

    var upload = multer({ storage: storage }).any();

    upload(req, res, function (err) {
        // I can access req.body here
    });
});

我在
storage
中设置的
destination
将取决于
body
对象的值(如
req.body.product
)。但是在调用
multer()
之前,我无法访问
req.body
。在设置
multer.storage
之前,如何访问
req.body

您需要为
diskStorage()使用
destination
config属性。例如:

var storage = multer.diskStorage({
  destination: function(req, file, cb) {
    var newAbsoluteDir = /* calculate based on `req.body` here */;
    cb(null, newAbsoluteDir);
  }
});

var upload = multer({ storage });

// ...

router.post('/submit', upload.any(), function(req, res) {
  // ...
});

正如文档所指出的,您需要在这些
multer
回调中访问的任何非文件字段都需要放在您正在处理的文件字段之前,因为多部分/表单数据请求的字段是有序的。因此,如果您有一个静态HTML表单,那么重要的是输入、选择等元素的文字位置。对于XHR,它是您为每个字段调用
formData.append()

谢谢:')的顺序,正如您在回答中提到的,我必须更改调用
formData.append()
的顺序,以便将文本值放在文件之前。raul您的注释保存了我@mscdex请在您的answer@mscdex我是指raul的评论,“我必须改变调用的顺序”,这很重要,否则我无法访问通过api请求发送的字段,文件字段应该是dict中的最后一个字段,至少在POSTMAN中,我在那里测试过