2016-03-23 39 views
3

我是新來的JavaScript,我有麻煩解決這個錯誤。我在「return callback(rolesArray)」中得到消息:「回調不是函數」。 回調是不是一個功能節點js

Rol.getAllRoles = function(callback){ 
 
    sql = "select role from Role;"; 
 
    var rolesArray = []; 
 
    var role; 
 
    mysql.connection(function(err,conn){ 
 
     if (err){ 
 
      return callback(err); 
 
     } 
 
     conn.query(sql,function(err,rows){ 
 
      if (err){ 
 
       return callback(err); 
 
      } 
 
      for(var i=0; i < rows.length; i++){ 
 
       role = rows[i].role; 
 
       rolesArray.push(rol); 
 
      } 
 
      console.log("roles: " + rolesArray); 
 
      return callback(rolesArray); 
 
     }); 
 
    }); 
 
}

的輸出的console.log: 「角色:管理員,客戶」,所以與數據庫作品的連接。

+2

你怎麼稱呼'Rol.getAllRoles',顯然是你沒有通過回調 – stalin

+0

歡迎來到堆棧溢出。關於堆棧溢出,你應該知道的一件事是,當你發佈一個問題時,最好的機會是發佈後的前30分鐘左右(大多數人看到它時,尤其是如果你的問題在一個忙標籤上)。因此,當有人與你的問題交談,詢問你一些事情時,你應該回答這個問題。這不像其他在線論壇,你發佈的問題,並在第二天回來。如果問題不完全清楚,並且您無法澄清,您的問題可能會在短時間內關閉。 – jfriend00

+0

所以,現在已經過了一個多小時,因爲你發佈了,你被要求澄清你的問題,你沒有迴應。在詢問確認您的問題後,您應該在前15-30分鐘內至少檢查幾次,並與任何提問或發佈答案的人互動。這就是你如何確保我們正確理解你的問題,並且答案是朝着正確的方向前進的。 – jfriend00

回答

0

我建議如下:

Rol.getAllRoles = function(callback){ 
 
    var sql = "select role from Role;"; 
 
    var rolesArray = []; 
 
    var role; 
 
    callback = callback || function(){}; 
 
    mysql.connection(function(err,conn){ 
 
     if (err){ 
 
      return callback(err); 
 
     } 
 
     conn.query(sql,function(err,rows){ 
 
      if (err){ 
 
       return callback(err); 
 
      } 
 
      for(var i=0; i < rows.length; i++){ 
 
       role = rows[i].role; 
 
       rolesArray.push(rol); 
 
      } 
 
      console.log("roles: " + rolesArray); 
 
      return callback(rolesArray); 
 
     }); 
 
    }); 
 
}

這樣,您就強制執行的回調始終是一個函數。如果你像Rol.getAllRoles()那樣運行它,那麼你以前會得到一個錯誤。現在你不會。你不會得到任何數據。

確保您使用正確的參數(即:函數)調用Rol.getAllRoles。

+0

這可能會消除錯誤,但是如果OP未傳遞適當的回調,那麼它們無法獲得數據庫查詢的結果,因此看起來很難看出這可能是一種有用的更改或解決方案OP的問題。目標是既解決錯誤,又從操作中獲得結果。這不能完成這兩個。 – jfriend00

+0

你沒看過我的整個答案嗎?具體是最後兩段。 – Eeems

+0

我讀到了 - 你說的是答案的執行部分?這只是你沒有真正回答這個問題。而且,即使他們確實傳遞了適當的功能,調用約定也很難區分成功和錯誤。除此之外還有更多 - 它不是一個完整的答案。你不建議一種方法來隱藏不能解決問題的錯誤。 – jfriend00

2

該錯誤表示當您調用它時,您沒有將功能傳遞給Rol.getAllRoles(fn)。因此,您可以在回調中進行適當的錯誤處理,因此您可以更輕鬆地區分錯誤和應更改的實際數據,因此始終將第一個參數傳遞給回調,以指示是否存在錯誤,然後第二個參數(如果不是錯誤),可以是你的結果數組是這樣的:

Rol.getAllRoles = function(callback){ 
    sql = "select role from Role;"; 
    var rolesArray = []; 
    var role; 
    mysql.connection(function(err,conn){ 
     if (err){ 
      return callback(err); 
     } 
     conn.query(sql,function(err,rows){ 
      if (err){ 
       return callback(err); 
      } 
      for(var i=0; i < rows.length; i++){ 
       role = rows[i].role; 
       rolesArray.push(rol); 
      } 
      console.log("roles: " + rolesArray); 
      // make sure the first argument to the callback 
      // is an error value, null if no error 
      return callback(null, rolesArray); 
     }); 
    }); 
} 

而且,那麼你應該調用它像這樣:

Rol.getAllRoles(function(err, rolesArray) { 
    if (err) { 
     // handle error here 
    } else { 
     // process rolesArray here 
    } 
}); 

調用異步回調中的這種風格callback(err, data)是一種非常常見的異步回調設計模式。它允許所有呼叫者查看是否有錯誤,以及是否沒有錯誤可以訪問最終結果。