如果写入任何数据,NodeJS https POST请求将引发套接字挂起错误

时间:2014-03-21 09:30:55

标签: javascript node.js rest https meteor

我正在尝试与外部API进行交互,我需要通过HTTPS发布XML文档。

所以我使用节点https接口来尝试发出请求但是如果我尝试编写任何数据(XML文档),它会抛出一个套接字挂起。如果我没有在请求中写任何内容或空字符串,那么就完成帖子就好了。

我已经用谷歌搜索并发现其他人有这个错误,但我还没有能够按照其他人找到的解决方案来修复它。

我正在使用Meteor,它具有用于发出这些类型请求的HTTP包。 HTTP包也抛出了这个错误,所以我挖掘并使用节点' https'来实现帖子。包认为它可以解决问题,但我也得到了与https相同的错误。

这是我的代码:

var http = Npm.require("http");
var oauthSignature = Npm.require('oauth-signature');
var URL = Npm.require('url');

var content = "XML String Here";
var postDestinationUrl = "https://example.com/api/path";

var authObject = {
    oauth_consumer_key: "consumerKey",
    oauth_signature_method: "HMAC-SHA1",
    oauth_timestamp: (Math.round(new Date().getTime() / 1000)).toString(10),
    oauth_nonce: Random.id(),
    oauth_version: "1.0"
};

authObject.oauth_signature = oauthSignature.generate("POST", postDestinationUrl, authObject, "shared Secret Here");
var authString = objectToQueryString(authObject);

var headers = {
    Connection: "keep-alive",
    'Content-Length': Buffer.byteLength(content),
    Authorization: authString,
    'Content-Type': 'application/xml'
};

var parsedUrl = URL.parse(postDestinationUrl);

var requestOptions = {
    hostname: parsedUrl.hostname,
    path: parsedUrl.pathname,
    method: "POST",
    headers: headers
};


var request = https.request(requestOptions, function(response){
    var body = '';
    console.log("statusCode from https.request: ", response.statusCode);
    console.log("headers from https.request: ", response.headers);

    response.on("data", function(data){
        body += data;
    });  // end of data

    response.on("end", function(){
        console.log("body from https.request: ", body);
    }); // end of end

    response.on("error", function(){
        console.log("error in https.request response");
    }); // end of error
}); // end of request

request.write(content);
request.end();

request.on("error",function(error){
    console.log("Error in https.request: " + error.message);
    callback(error, undefined);
}); // end of error




var objectToQueryString = function(queryObject){
    var queryString = "";
    _.each(queryObject, function(value, key, list){
        queryString += key + '="' + value +'",';
    });
    return queryString.substr(0, queryString.length -1);
};

我看到的错误:

"stack":"Error: socket hang up
at Object.Future.wait (/Users/dsyko/.meteor/tools/f3947a4651/lib/node_modules/fibers/future.js:326:15)
at packages/meteor/helpers.js:111
at Meteor.methods.submitAPIPost (packages/api-interface/api_server.js:412)
at packages/check/match.js:77
at _.extend.withValue (packages/meteor/dynamics_nodejs.js:35)
at Object.Match._failIfArgumentsAreNotAllChecked (packages/check/match.js:76)
at maybeAuditArgumentChecks (packages/livedata/livedata_server.js:1403)
at packages/livedata/livedata_server.js:580
at _.extend.withValue (packages/meteor/dynamics_nodejs.js:35)
at packages/livedata/livedata_server.js:579
 - - - - -
at createHangUpError (http.js:1472:15)
at CleartextStream.socketCloseListener (http.js:1522:23)
at CleartextStream.EventEmitter.emit (events.js:117:20)
at tls.js:696:10
at process._tickCallback (node.js:415:13)"

我已经使用postman来制作相同的API请求,但它经历的很好,所以它似乎不是一个糟糕的终点。我还切换到发布到http并使用Wireshark来检查HTTP POST的标题和内容,以确保我没有在请求中修改某些东西,但在那里看起来都很好。此外,当我切换到http时,XML文档通过正常,我没有看到套接字挂断(尽管端点响应重定向到https网址,所以我不能只使用http)

0 个答案:

没有答案