2017-04-14 115 views
-1

我遇到問題,並且在解決這些問題時我感覺不到我的深度。使用Node.js獲取請求時發生嵌套的HTTP錯誤

一,我對Node的理解是很新/不成熟的,兩個我對http的理解並不是最強的。

所以這裏出來給社區一些有希望的幫助。

我已經審查了我的代碼,首先通過使用靜態類型的對象數組抽象它的意圖,並運行它瀏覽器端以確保所有工作正常(缺少http.get請求)。

我已經將相同的代碼移到了節點服務器端,並使用與本地使用的相同的抽象數據集成功運行,並且所有工作都正常(主端口3030實例)。

然後我開始介紹一個稍微複雜一點的http.get。

說明

一切,我做我的本地機器上正在發生的事情進行測試/非生產狀態發展。

MyServerSetup

在這情況下,我最終從我的本地機器上的端口3030執行http.get請求和呼叫到節點的另一個實例(CMD.EXE上的一個單獨的實例中運行)聽在端口3000

我測試過3000在其自己的瀏覽器,它是按預期工作:

我火了鉻,轉到HTTP://:3000 /彎/ 1,它返回我爲它設置的內容(它對URL中提供的最後一個值運行SQL select語句,並返回一個JSON.stringify(obj)ba ck到瀏覽器 - 見下圖)。

Proof_Of_3000_Working

然後我點我的瀏覽器中輸入http://:3030,並獲得:

Server Started on Port 3030... 
TypeError: listener must be a function 
    at TypeError (native) 
    at ClientRequest.once (events.js:190:11) 
    at new ClientRequest (_http_client.js:93:10) 
    at Object.exports.request (http.js:49:10) 
    at Object.exports.get (http.js:53:21) 
    at getBendAndTypeByBend (<<MyPort3030Root>>\program.js:26:9) 
    at p_processBends (<<MyPort3030Root>>\program.js:58:14) 
    at doAll (<<MyPort3030Root>>\program.js:74:3) 
    at <<MyPort3030Root>>\program.js:82:2 
    at Layer.handle [as handle_request] (<<MyPort3030Root>>\node_modules\express\lib\router\layer.js:95:5) 

我將高興地顯示代碼,但我不知道哪一段是真需要解決問題,因爲當沒有HTTP.GET請求時,那麼每個請求都可以正常運行。

我只是不知道現在是哪一種方式,我希望這裏的某個人能幫助我理解從哪裏開始理解問題,但最終如何解決問題。

我知道這可能會問很多,但我真的覺得這個問題很困難,因爲事情似乎在工作,直到我把它們連接在一起。


這裏正在從端口稱爲可疑代碼片段:3030

http = require('http'); 
fs = require('fs'); 
async = require('async'); 
q = require('q'); 
express = require('express'); 

app = express(); 

bends = [ 
    {"bend" : "1", "type" : ""}, 
    {"bend" : "2", "type" : ""}, 
    {"bend" : "7", "type" : ""}, 
    {"bend" : "14", "type" : ""}, 
    {"bend" : "33", "type" : ""}, 
    {"bend" : "48", "type" : ""}, 
    {"bend" : "73", "type" : ""}, 
    {"bend" : "82", "type" : ""} 
]; 

function getBendAndTypeByBend(bendStr) { 
    result = {"bend" : "", "type" : "", "status" : "false"}; 
    for (var i=0;i<bends.length;i++) { 
     http.get('http://localhost:3000/bend/'+bendStr, 'utf-8', function(err, res) { 
     if (err) { 
      console.log(err); 
     } 
     res.on('end', function(err, res1) { 
      result.bend = bendStr; 
      result.type = JSON.parse(res).row; 
      if(i == bends.length-1) { 
       result.status = "true"; 
       return result; 
      } else { 
       result.status = "false"; 
      } 
     }) 
     });*/ 
    } 
} 

function p_initTables() { 
    bt1 = bends.slice();//(b)end(t)able1 
    return bt1; 
} 

function p_processBends(btArr) { 
    localbt = btArr.slice(); 
    //console.log(localbt); 
    newbt = []; 
    for(var i=0;i<localbt.length;i++){ 
     newbt.push(
      { 
       "bend" : localbt[i].bend, 
       "type" : getBendAndTypeByBend(localbt[i].bend).type 
      } 
     ); 
    } 
    return newbt; 
} 

function p_renderBendTableToUser(bt) { 
    for(var i=0;i<bt.length;i++) { 
     console.log("BEND: "+bt[i].bend + " | TYPE: "+bt[i].type+"\n"); 
    } 
    return console.log("\ndone"); 
} 

function doAll() { 
    p_renderBendTableToUser(
     p_processBends(
      p_initTables() 
     ) 
    ); 
    return 1; 
} 

app.get('/', function() { 
    doAll(); 
}); 

app.listen(3030, function(err, res){ 
    if (err) { 
     return console.error(err); 
    } 
    console.log('Server Started on Port 3030...'); 
}); 

app.listen(3030, function(err, res){ 
    if (err) { 
     return console.error(err); 
    } 
    console.log('Server Started on Port 3030...'); 
}); 

這裏是被稱爲運行@ PORT代碼:3000

var express = require('express'); 
var sql = require('sqlite3'); 

app = express(); 

app.get('/bend/:id', function(req, res){ 
    var db = new sql.Database('<mySQLite3Path>/rebarFabTypes.db'); 
    db.get("SELECT bend, type FROM fabtype WHERE bend = '"+req.params.id+"'", function(err, row) { 
     if (typeof row !== 'undefined') { 
      console.log(row.type); 
      res.end(JSON.stringify({"row" : row.type})); 
     } else { 
      res.end(JSON.stringify({"row" : "UNKNOWN"})); 
     } 
    }); 
    db.close(); 
}); 

app.listen(3000, function(err, resp){ 
    console.log('Server Started on Port 3000...'); 
}); 
+0

讀這讓我覺得我再次回到學校..停下來..併發布錯誤發生腳本的一些代碼。 – Gntem

+0

@ Mr.Phoenix好的,我會發布雙方,以便你可以看到發生了什麼。 –

+0

嗯..如果你想從一個服務器向另一個服務器發送一個http請求請求,那麼這兩個腳本都會有很多錯誤的事情發生。也請嘗試閱讀一些快速教程,並始終使用文檔。 NodeJS和http模塊不是「不成熟」或「弱」的。 – Gntem

回答

1

看起來像你的問題可能在這一行。

http.get('http://localhost:3000/bend/'+bendStr, 'utf-8', function(err, res) { 

去由文檔 - https://nodejs.org/api/http.html#http_http_get_options_callback,到http.get第二參數應該是一個函數。在你的情況下,它是第三個參數(這是什麼節點似乎在堆棧跟蹤中抱怨)

嘗試刪除第二個參數utf-8,你應該能夠通過該錯誤。

+0

完美,我沒有看到它。很可能是因爲我在混合方法。 –

相關問題