5

SQLiteクエリが結果を返さない場合に実行されるコードを書き込もうとしています。ただし、Node.jsの非同期性により、これは困難です。空の結果を引き起こす入力でテストしても何も起こらないため、コールバック関数内にコードを記述できるかどうかはわかりません。

私がやっている

 db.each("SELECT pid, collection , photo FROM photos WHERE collection = '"+collection_id+"' AND pid = '"+photo_id+"' ", function(err, row) {
      console.log("PHOTO FOUND");

//code inside the callback function

  });
    //code I want

具体的には、ユーザーがデータベースにないものを要求した場合に備えて、一般的なものをレンダリングしたいのですが、どうすればよいですか?

4

1 に答える 1

9

これは、使用しているように見えるパッケージのAPIドキュメントからのものです(私の強調):

Database#each(sql、[param、...]、[callback]、[complete])

指定されたパラメーターを使用してSQLクエリを実行し、結果行ごとにコールバックを呼び出します。この関数は、データベースオブジェクトを返し、関数の連鎖を可能にします。パラメータは関数と同じですがDatabase#run、次の違いがあります。

コールバックの署名はですfunction(err, row) {}結果セットが成功したが空の場合、コールバックは呼び出されません。他のすべての場合、コールバックは取得された行ごとに1回呼び出されます。呼び出しの順序は、結果セットの行の順序に正確に対応しています。

すべての行コールバックが呼び出された後、完了コールバックが存在する場合は呼び出されます。最初の引数はエラーオブジェクトであり、2番目の引数は取得された行の数です。関数を1つだけ指定すると、行のコールバックとして扱われます。2つを指定すると、最初の(==最後から2番目の)関数が行のコールバックになり、最後の関数が完了のコールバックになります。

クエリが返す行数が非常に限られていることがわかっている場合は、Database#allを使用してすべての行を一度に取得する方が便利な場合があります。

したがって、コードは次のようになります。

var sql = "SELECT pid, collection , photo FROM photos WHERE collection = '"+collection_id+"' AND pid = '"+photo_id+"' ";
db.each(sql, function(err, row) {
  console.log("PHOTO FOUND");
  //code inside the callback function
}, function(err, rows) {
  if (rows == 0) {
    //code I want
  }
});
于 2012-11-25T18:53:54.777 に答える