http.get或http.request回调仅在shell中显示 - node.js
问题描述:
新的节点,并试图不做任何回调地狱。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()
不会发回内容。
答
首先,你需要回调,其结果为实际可用内发送,因为你不能从一个异步函数
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);
});
}
我试过类似这样的东西。尝试将回调传递给http.get()时,我遇到'callback(null,str)不是函数'。 – Pobe
这是因为你已经将'callback'重新定义为'end'的参数,它没有回调。我已经从上面的代码中删除了这个参数。 – adeneo
仍然是一个空白页面。我和你有相同的代码,导致'routes.js'使用console.log正确显示结果。它不再涉及回调处理。 – Pobe