nodejs https回调不更新全局变量

时间:2013-12-30 12:37:04

标签: javascript node.js https restify

我在nodejs中设置一个快速代理服务器来代理Angular应用程序的API请求。代理端点是我无法控制的服务,不支持CORS或JSONP。为了测试,我在下面的代码示例中设置了一个虚拟http服务器,但实际上这是一个远程域。

我很确定我的问题是由于nodejs的异步处理,但我不知道如何解决这个问题。我的通用makeRequest()函数似乎工作正常,它从远程服务器获得预期的响应。我可以看到on('data')和on('end')事件处理程序中的resultData字符串成功。但是,我不知道如何在restify的req.json()方法中将响应返回给浏览器。

帮助!

var restify = require('restify');
var querystring = require('querystring');
var https = require('https');
var http = require('http');
var port        =  '8080';
var server = restify.createServer({
    name : "ProxyService"
});
var responseData = '';

// Generic request function
function makeRequest(host, endpoint, method, data, headers) {
    var dataString = JSON.stringify(data);

    var options = {
      host: host,
      path: endpoint,
      method: method,
      headers: headers
    };

    var req = https.request(options, function proxyrespond(res) {

      res.on('data', function(data) {
        console.log("DATA----", data);
        responseData += data;
      });

      res.on('end', function() {
        //probably need to do something here
      });
    });
    req.end();
    req.on('error', function(e) {
        console.error(e);
    });

    console.log("OPTIONS: ", options);
    console.log("DATA: ", responseData);
    req.write(dataString);
    req.end();
};

server.get('/getlist', function respond(req, res, next){
    var headers     =  {'Connection': 'close',
                        'Content-Type': 'application/json' };
    var host = 'localhost:9000';
    var endpoint = '/getlist';
    var auth = {auth-id: '12345', auth-token: '6789'}
    var data = req.data || '';

    // add authentication parms to the endpoint
    endpoint += '?' + querystring.stringify(auth);

    // if the request has headers, add them to the object
    for (var key in res.headers) {
        headers[key] = rest.headers[key];
    };

    makeRequest(host, endpoint, 'GET', data, headers);
    res.headers = {Connection: 'close'};
    res.json( responseData );
    return next();
});

http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2));
  res.end();
}).listen(9000);

server.listen(port, function(){
    console.log('%s listening at %s ', server.name , server.url);
});

1 个答案:

答案 0 :(得分:0)

通过回调函数返回:

// Generic request function
function makeRequest(host, endpoint, method, data, headers, callback) {
    .........
    var req = https.request(options, function proxyrespond(res) {
      // DO NOT declare responseData as global variable
      var responseData = '';
      res.on('data', function(data) {
        responseData = responseData + data;
      });

      res.on('end', function() {
        // RETURN VIA CALLBACK
        callback(responseData)
      });
    });
    .........
};

server.get('/getlist', function respond(req, res, next){
    .........

    makeRequest(host, endpoint, 'GET', data, headers, function (responseData) {
        res.headers = {Connection: 'close'};
        res.json( responseData );
        return next();
    });

});