2016-10-01 23 views
1

新的节点,并试图不做任何回调地狱。http.get或http.request回调仅在shell中显示 - node.js

我有两个文件 routes.js fetch.js

//routes.js 
var fetchController = require("../lib/mtl_fetcher/fetcher_controller"); 
var express = require('express'); 
var router = express.Router(); 

router.get('/', function(req, res, next) { 
    res.send(fetchController.getAllTransgressor(function(results) { 
     return results.end(); 
    })) 
}); 

module.exports = router; 

//fetch.js 
    var http = require('http'); 
    var config = require('./config') 
    var Iconv = require('iconv').Iconv 

    module.exports.getAllTransgressor = function(callback) { 

     var req = http.get(config.urlOptions.host, function (response) { 
      var bufferChunk = []; 
      var str 

      if(response.statusCode == 200) { 

       response.on('data', function(chunk) { 
        bufferChunk.push(chunk); 
       }) 

       response.on('end', function(callback) { 
        var iconv = Iconv('latin1', 'UTF-8'); 
        str = iconv.convert(Buffer.concat(bufferChunk)).toString(); 
        console.log(str) 
       }); 
      } else { 
       console.log("handle this") 
      } 
     }); 

     req.on("error", function(err) { 
      callback(err); 
     }); 

     callback(req) 
    } 

因此我们的目标是获取,然后会显示已经获取到屏幕上。资源是XML基础。

在一个块(routes.js)中完成所有这些工作,但是当我尝试重构并设置一些模块时,我的str只是在shell标准输出中显示。使用req.end()不会发回内容。

回答

3

首先,你需要回调,其结果为实际可用内发送,因为你不能从一个异步函数

router.get('/', function(req, res, next) { 
    fetchController.getAllTransgressor(function(error, results) { 
     if (error) { 
      // handle errors 
     } else { 
      res.send(results); 
     } 
    }); 
}); 

也是一样的回调函数,它必须返回当数据可用时,在请求和解析之后调用

module.exports.getAllTransgressor = function(callback) { 

    var req = http.get(config.urlOptions.host, function(response) { 
    var bufferChunk = []; 

    if (response.statusCode == 200) { 

     response.on('data', function(chunk) { 
     bufferChunk.push(chunk); 
     }); 

     response.on('end', function() { 
     var iconv = Iconv('latin1', 'UTF-8'); 
     var str = iconv.convert(Buffer.concat(bufferChunk)).toString(); 

     callback(null, str); // here, stuff is available 
     }); 

    } else { 
     callback('Did not return 200', err); 
    } 
    }); 

    req.on("error", function(err) { 
    callback(err, null); 
    }); 

} 
+0

我试过类似这样的东西。尝试将回调传递给http.get()时,我遇到'callback(null,str)不是函数'。 – Pobe

+0

这是因为你已经将'callback'重新定义为'end'的参数,它没有回调。我已经从上面的代码中删除了这个参数。 – adeneo

+0

仍然是一个空白页面。我和你有相同的代码,导致'routes.js'使用console.log正确显示结果。它不再涉及回调处理。 – Pobe