Node.js https.request客户端';文件大小为0时从未调用s req.end()
我正在尝试创建节点服务器,以便使用代理进行文件上载 该服务器的主要角色是从客户端代理获取HTTP PUT请求,并将其发送到OpenStack Swift服务器 源代码如下所示: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
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….'语句,则该语句不得位于任何回调函数中。