如何在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"为了价值。 键值显示但不是值
答案 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' }