节点/请求错误:“处理POST请求:无内容types”

我有一个前端canvas,我转换成一个PNG文件,我需要张贴到第三方供应商的API。 它作为base64文件传递回节点,然后解码,但是当我尝试上传时,它给了我以下错误:

处理POST请求时出现问题:没有指定Content-Type

但是,我明确指定我的POST调用中的内容types。 我的最终目标是将file upload到供应商的API。

以下是关键的前端方面:

var canvasImage = document.getElementById("c"); var img = canvas.toDataURL({ multiplier: canvasMultiplier }); var fileTime = Date.now(); var myFileName = $scope.productCode + fileTime; $scope.filenameForVendor = myFileName; var filename = $scope.filenameForVendor; $http.post('/postVendor', { filename: filename, file: img }).success(function (data) { console.log("Uploaded to Vendor"); 

这是后端POST:

 app.post('/postVendor', function (req, res, next) { var filename = req.body.filename; var file = req.body.file; fileBuffer = decodeBase64Image(file); request({ url: "http://myvendorapi/ws/endpoint", method: "POST", headers: { 'contentType': fileBuffer.type }, body: fileBuffer.data }, function (error, response, body) { console.log(response); }); }) // Decode file for upload function decodeBase64Image(dataString) { var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/), response = {}; if (matches.length !== 3) { return new Error('Invalid input string'); } response.type = matches[1]; response.data = new Buffer(matches[2], 'base64'); return response; } 

我可以在前端使用AJAX进行POST,但是由于CORS和供应商阻止了所有服务器端对端点的调用(而且它们没有JSONP),所以我不能使用它。 他们允许我的IP通过testing目的,所以只有我可以从我的机器上做这个工作:

 var send = function (blob) { var fileTime = Date.now(); var myFileName = $scope.productCode + fileTime; $scope.filenameForVendor = myFileName; var filename = $scope.filenameForVendor; var formdata = new FormData(); formdata.append('File1', blob, filename); $.ajax({ url: 'http://myvendorapi/ws/endpoint', type: "POST", data: formdata, mimeType: "multipart/form-data", processData: false, contentType: false, crossDomain: true, success: function (result) { console.log("Upload to Vendor complete!"); // rest of code here/including error close out } var bytes = atob(dataURL.split(',')[1]) var arr = new Uint8Array(bytes.length); for (var i = 0; i < bytes.length; i++) { arr[i] = bytes.charCodeAt(i); } send(new Blob([arr], { type: 'image/png' })); 

更新:

我意识到contentType应该是'内容types'。 当我这样做时,它会创build一个没有指定边界的错误,因为我尝试使用多部分forms的数据(我做错了所有的错误)。 我怎样才能将formData传递给节点上传?

更新2:

根据提供的build议,我尝试使用multer,但得到一个ReferenceError:XMLHttpRequest未定义。

客户端:

  var fileTime = Date.now(); var myFileName = $scope.productCode + fileTime; $scope.filenameForVendor = myFileName; var filename = $scope.filenameForVendor; var formdata = new FormData(); formdata.append('File1', blob, filename); $http.post('/postVendor', formdata, { transformRequest: angular.identity, headers: { 'Content-Type': undefined } }).success(function (data) { 

服务器端:

 app.post('/postVendor', function (req, res, next) { var request = new XMLHttpRequest(); request.open("POST", "http://myvendorapi.net/ws/endpoint"); request.send(formData); }) 

为什么你base64编码的文件?

您可以使用FormData将原始file upload到您的节点,您将不必解码任何东西。

前端

 ... var request = new XMLHttpRequest(); request.open('POST', 'http://node.js/method'); request.send(formData); // vanilla 

– – 要么 – –

 ... $http.post('http://node.js/method', formData, { transformRequest: angular.identity, headers: {'Content-Type': undefined} }); // angular 

后端

只需安装请求 。

 ... var request = require('request'); app.post('/method', function (req, res, next) { // if you just want to push request you don't need to parse anything req.pipe(request('http://vendor.net')).pipe(res); }) // express