0

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

该服务器的主要作用是从客户端代理获取 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)的文件时,就会出现问题。

即使要上传的文件大小为 1KB,也可以正常工作。

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

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

谁能帮我?

4

1 回答 1

0

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

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

当你调用请求函数时,它不应该在任何回调函数中。在这种情况下,请求函数在“new Swift()”和“db.query”的回调函数中被调用。

如果 request body 的 content-length 为 0,则可以在调用 request.call 之前调用 request 的 end 事件。

所以,你应该记住这一点。

如果你想使用 'request.call(swift....' 语句,它不能在任何回调函数中。

于 2013-01-16T07:55:54.130 回答