解析nodejs服务器上的formdata请求

时间:2014-05-11 23:59:10

标签: javascript json node.js angularjs

如何在nodejs端解析formdata?

我正在向nodejs服务器发送http POST请求。 这是Javascript的片段(角度在其中)。我的目标是上传文件并向其添加JSON。所以我上传的图片和json有{account:xx,sitename:xyz等等}}

$scope.upload[index] = $upload.upload({
                url :  'http://localhost:1215/facility',
                method: $scope.httpMethod,
                headers: {'Content-Type': 'multipart/form-data','X-Requested-With':'XMLHttpRequest'},
                data :  $scope.selectedSite,
                withCredentials:true,
                file: $scope.selectedFiles[index],
                fileFormDataName: 'myFile'
            }).then(function(response) {
                $scope.uploadResult.push(response.data);
            }, null, function(evt) {
                $scope.progress[index] = parseInt(100.0 * evt.loaded / evt.total);
            }).xhr(function(xhr){
                xhr.upload.addEventListener('abort', function(){console.log('aborted complete')}, false);
            });
}

我正在使用angular-upload-file,它允许我构造formdata。它将selectedSite json与文件和文件名组合在一起。在github上找到它,它正在做的伎俩。 [angular-file-upload] [1] https://github.com/danialfarid/angular-file-upload。提琴手证实了这一点。

此库angular-file-upload的工作方式是带有XMLHTTPREQUEST的http将导致正文引用formdata,如下所示

{  
   site:xyz,
   account:xxx,
   etc
   Myfile: somefile.txt: fileContent 
}

在服务器端,无论我做什么,我都无法获得json密钥(例如xyz)的值或文件的内容。我还没有尝试保存文件或操纵json。

router.post('/', passport_utils.ensureAuthenticated,
    function(req, res)
    {
        var data ,file= {};//reconstruct site from formdata

        console.log("req.body"  + req.body);
        //jsonData = JSON.stringify(data);
        for(var field in req.body){
            console.log(field); //prints all the json elements but not the file or the filename
                if(field.match(‘site’))
                    console.log("HI    username "+ field.site) ;
                if(field.match('account'))
                    console.log("hi data " + field.name);
        res.send(200);
  }

我尝试使用field [jsonkey]或field.jsonkey来获取值。上面的for循环确认我有键而不是值。所有这些导致" undefined"为了价值。 键值显示但不是值

2 个答案:

答案 0 :(得分:3)

看起来您正在使用Express 4,如果您使用Express,则需要在服务器中设置body parser

var bodyParser     = require('body-parser');
//...

var app            = express();
//...
app.use(bodyParser());  // pull information from html in POST

在早期版本的Express中,您只需要从框架本身添加正文解析器:

app.use(express.bodyParser());                      // pull information from html in POST

由于版本4现在删除了对connect的支持,因此您需要将多部分/表单数据的自定义支持添加到解析器多部分/部分POST,因此您必须执行以下操作:

var busboy = require('connect-busboy');    
app.use(busboy());

答案 1 :(得分:1)

我已修复使用以下想法

在服务器端,我使用了身体解析器的json中间件

app.use(bodyParser.json());

在Agular方面,发送标题内容类型" application / json"

headers: {'Content-Type': 'application/json' }