2016-10-01 22 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