簡體   English   中英

http.get或http.request回調僅在shell中顯示 - node.js

[英]http.get or http.request callback only shows within 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 stdout中。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM