意外的令牌 - 在解析 json 请求时
Unexpected token - while parsing json request
我有两个节点服务器,我正在尝试使用 rest api 在它们之间发送文件。但是,当我发送数据时,我在接收服务器上得到一个 "Unexpected token -"。在发件人上,我收到 [错误:结束后写入]。
我的路由器代码:
var express = require('express');
var multer = require('multer');
var path = require('path');
var Router = express.Router;
const MODULES_PACKAGES_UPLOAD_DIR = path.resolve('/tmp');
module.exports = function() {
var router = new Router();
var storage = multer.diskStorage({
destination: function(req, file, cb){
cb(null, MODULES_PACKAGES_UPLOAD_DIR);
}
});
var upload = multer({storage: storage});
router.post('/fileUpload', upload.array(), function(req, res){
debug('We have a a file');
//Send the ok response
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
res.end('\n');
}
发送代码:
var Util = require('util');
var http = require('request-promise');
var request = require('request');
var fs = require('fs');
var Post = require('http');
var FormData = require('form-data');
//Generate the form data
var formdata = modules.map(function(fileName){
return fs.createReadStream('/opt/files/'+fileName);
});
var data = getData(); //Gets the body of the code as a promise
return Promise.all(data)
.then(function(dataResults){
var options = {
method: 'POST',
uri: 'https://' + name +'/file',
rejectUnauthorized: false,
timeout: 2000,
body: {
keys: keyResults,
modules: modules,
},
formData: { <====== If I remove this section everything works
'module-package': formdata,
},
json: true // Automatically stringifies the body to JSON
};
request.post(options, function(err, response){
if( err){
debug('Error: ',err);
}
else{
debug('We posted');
}
});
奇怪的是,如果我删除 formData 部分,那么一切正常,但当它在那里时,我得到一个异常:
SyntaxError: Unexpected token -
at parse (/home/.../projects/node_modules/body-parser/lib/types/json.js:83:15)
有谁知道我可能做错了什么??
以防万一以后有人遇到同样的问题。正如@Bergi 提到的。您不能同时拥有 json 数据和表单数据。您需要选择其中之一。解决方案是将 json 数据作为表单的一部分传递。
var options = {
method: 'POST',
uri: 'https://' + name +'/file',
rejectUnauthorized: false,
timeout: 2000,
body: {
},
formData: {
'module-package': formdata,
keys: keyResults,
modules: modules,
},
json: true // Automatically stringifies the body to JSON
};
request.post(options, function(err, response){
if( err){
debug('Error: ',err);
}
else{
debug('We posted');
}
});
在我的例子中,HTTP 请求的 header 包含 "Content-Type" 作为 "application/json"。
所以这里是要检查的东西:
- 仅发送 form-data 或 json body。不是两者。
- 如果提到 "Content-Type",请检查 Headers。删除那个。
我有两个节点服务器,我正在尝试使用 rest api 在它们之间发送文件。但是,当我发送数据时,我在接收服务器上得到一个 "Unexpected token -"。在发件人上,我收到 [错误:结束后写入]。
我的路由器代码:
var express = require('express');
var multer = require('multer');
var path = require('path');
var Router = express.Router;
const MODULES_PACKAGES_UPLOAD_DIR = path.resolve('/tmp');
module.exports = function() {
var router = new Router();
var storage = multer.diskStorage({
destination: function(req, file, cb){
cb(null, MODULES_PACKAGES_UPLOAD_DIR);
}
});
var upload = multer({storage: storage});
router.post('/fileUpload', upload.array(), function(req, res){
debug('We have a a file');
//Send the ok response
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
res.end('\n');
}
发送代码:
var Util = require('util');
var http = require('request-promise');
var request = require('request');
var fs = require('fs');
var Post = require('http');
var FormData = require('form-data');
//Generate the form data
var formdata = modules.map(function(fileName){
return fs.createReadStream('/opt/files/'+fileName);
});
var data = getData(); //Gets the body of the code as a promise
return Promise.all(data)
.then(function(dataResults){
var options = {
method: 'POST',
uri: 'https://' + name +'/file',
rejectUnauthorized: false,
timeout: 2000,
body: {
keys: keyResults,
modules: modules,
},
formData: { <====== If I remove this section everything works
'module-package': formdata,
},
json: true // Automatically stringifies the body to JSON
};
request.post(options, function(err, response){
if( err){
debug('Error: ',err);
}
else{
debug('We posted');
}
});
奇怪的是,如果我删除 formData 部分,那么一切正常,但当它在那里时,我得到一个异常:
SyntaxError: Unexpected token -
at parse (/home/.../projects/node_modules/body-parser/lib/types/json.js:83:15)
有谁知道我可能做错了什么??
以防万一以后有人遇到同样的问题。正如@Bergi 提到的。您不能同时拥有 json 数据和表单数据。您需要选择其中之一。解决方案是将 json 数据作为表单的一部分传递。
var options = {
method: 'POST',
uri: 'https://' + name +'/file',
rejectUnauthorized: false,
timeout: 2000,
body: {
},
formData: {
'module-package': formdata,
keys: keyResults,
modules: modules,
},
json: true // Automatically stringifies the body to JSON
};
request.post(options, function(err, response){
if( err){
debug('Error: ',err);
}
else{
debug('We posted');
}
});
在我的例子中,HTTP 请求的 header 包含 "Content-Type" 作为 "application/json"。
所以这里是要检查的东西:
- 仅发送 form-data 或 json body。不是两者。
- 如果提到 "Content-Type",请检查 Headers。删除那个。