2016-03-23 17 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

ようこそ。スタックオーバーフローについて知っておくべきことの1つは、質問を投稿するときに、答えのための最良のチャンスは投稿後最初の30分です(ほとんどの人がそれを見ているとき、特にあなたの質問が忙しいタグ)。そのようなものとして、あなたの質問にあなたが何か質問する人がいるときは、そのコメントにお答えください。これは、質問を投稿して翌日に戻ってくる他のオンラインフォーラムと同じではありません。あなたの質問は、完全にはっきりしておらず、明確にすることができない場合、短時間で閉じられるかもしれません。 – jfriend00

+0

あなたが投稿してから1時間以上が経過しました。あなたはあなたの質問について何らかの明確化を求められましたが、あなたは答えていません。質問が理解されたことを確認した後、最初の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

あなたは私の全回答を読まなかったのですか?特に最後の2つのパラグラフ。 – 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)は非常に一般的な非同期コールバックデザインパターンです。これにより、すべての発信者は、エラーがあったかどうか、および最終結果にアクセスするためのエラーがないかどうかを確認できます。

関連する問題