Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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 意外令牌-在解析json请求时_Javascript_Node.js_Multer - Fatal编程技术网

Javascript 意外令牌-在解析json请求时

Javascript 意外令牌-在解析json请求时,javascript,node.js,multer,Javascript,Node.js,Multer,我有两个节点服务器,我正在尝试使用RESTAPI在它们之间发送文件。然而,当我发送数据时,我在接收服务器上得到了一个意外的令牌。在发送方上,我得到一个[错误:结束后写入] 我的路由器代码: var express = require('express'); var multer = require('multer'); var path = require('path'); var Router = express.Router; const MODULES_PACKAGES_UPLOAD_

我有两个节点服务器,我正在尝试使用RESTAPI在它们之间发送文件。然而,当我发送数据时,我在接收服务器上得到了一个意外的令牌。在发送方上,我得到一个[错误:结束后写入]

我的路由器代码:

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');
    }
  });

有人知道我做错了什么吗

以防万一将来有人会遇到同样的问题。正如@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请求的头包含的内容类型为application/json

以下是需要检查的事项:

仅发送表单数据或json正文。不是两者都有。 如果提到内容类型,请检查标题。去掉那个。
如果JSON解析器说JSON字符串无效,那么很可能是真的。提供它失败的确切JSON。它没有说明。它只是说-。我所知道的是,当我删除formData时,没有解析问题。它确实说在解析过程中有语法错误。只需检查body parser/lib/types/json.js库源代码。我所知道的是,当我删除formData时,没有解析问题,所以删除它,问题就解决了。好的,如果是关键,那么请帮助我们帮助您-检查解析的JSON。formData和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');
    }
});