2016-11-30 62 views
-3

我希望下面的函數(listServers())能夠在下面的快速請求中使用回調數據。但由於我搜索到的信息有衝突,所以我對回調的設置感到困惑。節點從數據庫查詢中回調以表示請求

服務器運行listServers很好,但在將值返回給請求時似乎超時。

從我的輸出請求/服務器上的是:

forEach length:1 
forEach length:2 
listServers length:2 
::ffff:*IP* - - [30/Nov/2016:09:31:19 +0000] "GET/HTTP/1.1" - - 

代碼:

var listServers = function (err, data) { 
    var list=[]; 
    db.all("SELECT * FROM Servers;", function(err, rows){ 
    rows.forEach(function(e){ 
     var confi = fs.readFileSync(paths.factorioDir + "server" + e.serverID + paths.conf); 
     var conf = JSON.parse(confi); 
     var item = {id: e.serverID, conf:conf}; 
     list.push(item); 
     console.log("forEach length:" + list.length); 
    }); 
    if (err) throw err; 
     console.log("listServers length:" + list.length); 
     data = list; 
    return data; 
    }); 

}; 

admin.get('/', function(req, res) { 
    listServers(function(err, data){ 
    console.log(data.length); 
    servers = data; 
    console.log("/ servers length"+ servers.length); 
     var adminTemplate = pug.compileFile(__dirname + '/template.pug'); 
     var context = { servers: servers }; 
     var html = adminTemplate(context); 
     res.send(html); 
}); 
}); 

的完整代碼here

+0

http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/ – xShirase

回答

0

什麼要傳遞到listServers()是一個回調函數,所以不要在listServers()中返回數據/拋出錯誤,而應該調用該回調並將其傳遞給eith呃錯誤或數據:

var listServers = function (callback) { 
    var list=[]; 
    db.all("SELECT * FROM Servers;", function(err, rows){ 
     if (err) { 
      callback(err, []); 

      return; 
     } 

     rows.forEach(function(e){ 
      var confi = fs.readFileSync(paths.factorioDir + "server" + e.serverID + paths.conf); 
      var conf = JSON.parse(confi); 
      var item = {id: e.serverID, conf:conf}; 
      list.push(item); 
      console.log("forEach length:" + list.length); 
     }); 

     console.log("listServers length:" + list.length); 
     callback(null, list); 
    }); 
}; 

admin.get('/', function(req, res) { 
    listServers(function(err, data){ 
     if (err) { 
      // Handle error 
     } 

     console.log(data.length); 
     servers = data; 
     console.log("/ servers length"+ servers.length); 
     var adminTemplate = pug.compileFile(__dirname + '/template.pug'); 
     var context = { servers: servers }; 
     var html = adminTemplate(context); 
     res.send(html); 
    }); 
});