http.get或http.requestcallback仅在shell – node.js中显示

新的节点,并试图不做任何callback地狱。

我有两个文件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()不会返回内容。

首先,你需要在callback里面发送结果是真正可用的,因为你不能从asynchronous函数返回

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

callback函数也是如此,当数据可用时,在请求和parsing之后,它必须被调用

 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); }); }