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) {}. 如果结果集成功但为空,则永远不会调用回调。在所有其他情况下,每个检索到的行都会调用一次回调。调用顺序与结果集中的行顺序完全对应。

调用所有行回调后,如果存在,将调用完成回调。第一个参数是一个错误对象,第二个参数是检索到的行数。如果您只指定一个函数,它将被视为行回调,如果您指定两个,第一个(==倒数第二个)函数将是行回调,最后一个函数将是完成回调。

如果您知道查询只返回非常有限的行数,使用 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 回答