【问题标题】:Node.js to return true or false after querying sqlite3Node.js 在查询 sqlite3 后返回 true 或 false
【发布时间】:2017-12-11 18:03:21
【问题描述】:

我正在尝试从节点函数中查询 sqlite3。根据结果​​,它应该将 TRUE 或 FALSE 返回给调用代码。这就是我所做的,但总是得到“未定义”:

var sqlite3 = require("sqlite3").verbose();


var dbOpen = function dbOpen() {
    sqlite3 = require('sqlite3').verbose();
    db = new sqlite3.Database('./internaldb/OPMSE.db');
}
module.exports.dbOpen = dbOpen;
dbOpen();
mKey = 'AIzaSyCrIYuHJ_jiZqmGYoAs7mxiloB3-OBx5WI';
async function db1() {
    function db2() {
        db.each("SELECT STATUS status FROM API_Keys WHERE KEY = ? AND STATUS = ?", [mKey, '1'], (err, row, x) => {
            var keyValid = false;
            if (err) {
                console.log('There is an error in API Validation')
            } else {
                console.log(keyValid + '<--This is from upper fun')
                keyValid = true;
                return keyValid;
            }
            db.close();
            return keyValid;
        });
    } // db2 
    d = await db2();
    console.log(d + '<--Supposed to return TRUE or FALSE')
} //db1

x = db1();
console.log(x)
/*Returns:
Promise { <pending> }
undefined<--Supposed to return TRUE or FALSE
false<--This is from upper fun
*/

【问题讨论】:

  • 什么是未定义的?
  • 查看 db.each 回调的函数表达式 ...返回的函数不会从函数 db2 返回...函数 db2 没有返回,因此它返回 undefined ... await 与否 - 您在 db1 中也没有 return 语句,因此它将返回值 undefined 的已解决承诺
  • 另外,db.each 建议回调可以被多次调用,那么您如何期望从多次调用回调中获得单个返回值。
  • 您使用 await db2()db2 不是异步的。它被定义为db1(异步)中的常规函数​​。你需要async function db2()
  • 函数 db2 正在返回。即使在函数 db1 中添加了 return,结果也是一样的。制作 db2,异步函数什么也没做。 db.each 将始终通过查询返回一条记录(我的测试表目前只有一条记录)。 keyValid 变量的值在函数 db2 中很好。但是db1函数看不到,我猜是这个问题。

标签: javascript node.js sqlite


【解决方案1】:

如果你让db2返回一个promise它会起作用,如果你想知道密钥是否在数据库中,最好select count它会返回一条记录,你不需要db.each(不知道获取一条记录的方法是什么)。

这是一些 cmets 的代码,这应该可以工作:

var sqlite3 = require("sqlite3").verbose();


var dbOpen = function dbOpen() {
  sqlite3 = require('sqlite3').verbose();
  db = new sqlite3.Database('./internaldb/OPMSE.db');
}
module.exports.dbOpen = dbOpen;
dbOpen();
mKey = 'AIzaSyCrIYuHJ_jiZqmGYoAs7mxiloB3-OBx5WI';
async function db1() {
  function db2() {
    //return a promise
    return new Promise(
      (resolve,reject)=>
        db.serialize(
          function() {
            var keyValid = false;
            db.each(//maybe not use each but just get one record and select count(*)
              "SELECT STATUS status FROM API_Keys WHERE KEY = ? AND STATUS = ?",
              [mKey, '1'], (err, row, x) => {
                if (err) {
                  reject(err);//reject on error
                } else {
                  console.log(keyValid + '<--This is from upper fun');
                  keyValid = true;
                }
              }
            );
            db.colose();
          }
        )
      )
  } // db2 
  d = await db2();
  console.log(d + '<--Supposed to return TRUE or FALSE')
} //db1

x = db1();
console.log(x)

【讨论】:

  • 感谢 HMR 的帮助。我仍然有未决的承诺。它期望从 db1 函数返回,我可以通过条件返回来完成。但是,为此我需要“keyValid = true;” (在“db.each”附件内)可以在 db1 函数中使用。如果能做到这一点,我的问题就解决了。谢谢大家的贡献。
  • @AlanMiley 首先你应该看看什么是承诺以及为什么使用它here。 db1 和 db2 都返回一个承诺,如果你想要这个值,你必须使用 '.then` 并使用 .catch 来获取错误所以db1.then(x=&gt;console.log("resolved",x)).catch(e=&gt;console.log("rejected:",e))
  • 感谢 HMR,了解 Promise 的工作原理对阅读很有帮助。欣赏它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2017-06-29
相关资源
最近更新 更多