Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Node.js https.request客户端';文件大小为0时从未调用s req.end()_Node.js_Sockets_Https_Upload_Request - Fatal编程技术网

Node.js https.request客户端';文件大小为0时从未调用s req.end()

Node.js https.request客户端';文件大小为0时从未调用s req.end(),node.js,sockets,https,upload,request,Node.js,Sockets,Https,Upload,Request,我正在尝试创建节点服务器,以便使用代理进行文件上载 该服务器的主要角色是从客户端代理获取HTTP PUT请求,并将其发送到OpenStack Swift服务器 源代码如下所示: var https = require('https') // ... some modules are required , Swift = reuiqre('swift') , mysql = require('mysql'); // some configurations function r

我正在尝试创建节点服务器,以便使用代理进行文件上载

该服务器的主要角色是从客户端代理获取HTTP PUT请求,并将其发送到OpenStack Swift服务器

源代码如下所示:

var https = require('https')
   // ... some modules are required
   , Swift = reuiqre('swift')
   , mysql = require('mysql');

// some configurations

function request(options, callback, pipe){
  var client = https.request(options, function(res){
    res.on('end', function(err){
      // something to do
    });
  });

  pipe.req.on('data', function(chunk){
    client.write(buffer);
  });

  pipe.req.on('end', function(err){
    client.end();
    callback(null, res);
  });
}

app.put('/upload', function(req, res, next){
  var swift = new Swift(swiftConfig, function(err, result) {
    var options = some logics for options here;
    db.query('SELECT * FROM SOMETABLE WHERE SOMETHING = ?'
          , [something]
          , function (err, results) {
              if (err) return next(err);
              request.call(swift, options, function(err, result) {
                if(err) { res.send(500, err) };
                res.end();
              }, {req: req});
    });
  });
}
当我从我的客户端PC中放入文件时,上面的代码工作得很好

但是,当我上传(即HTTP PUT)一个内容长度为0(0)的文件时,就会出现问题

  pipe.req.on('end', function(err){
    client.end();
    callback(null, res);
  });
即使上传的文件大小为1KB,也可以正常工作

但是,当我尝试上载0字节文件(空http正文)时,的“结束”事件(下面的代码)从未被调用,最后请求发出错误“错误:套接字挂起”


有人能帮我吗?

最后,我找到了这个问题的原因

请求函数(来自swift库)使用管道将数据从客户端代理到swift

调用请求函数时,它不应位于任何回调函数中。 在本例中,在“new Swift()”和“db.query”的回调函数中调用请求函数

如果请求正文的内容长度为0,则可以在调用“request.call”之前调用请求的“end”事件

所以,你应该记住这一点

如果要使用'request.call(swift….'语句,则该语句不得位于任何回调函数中。