【问题标题】:Asynchronous programming sequencing problems in node.jsnode.js 中的异步编程排序问题
【发布时间】:2018-12-26 06:47:00
【问题描述】:

我选择了一个项目,当第一次启动 node.js 程序时,将不存在任何数据库。如果数据库表不存在,程序应该创建它们。

但是,在下面的示例程序中,如果数据库在第一次运行时不存在,则不会插入数据,因为 select 语句失败。

下面代码的输出是:

$ node dbtest.js
finished initialise_database
program ended.
select err:  { Error: SQLITE_ERROR: no such table: mytable errno: 1, code: 'SQLITE_ERROR' }
successfully created mytable table
database closed.

从日志中可以看出,代码假定同步执行。

我假设正在发生的事情是 node.js 运行时系统使用不同的线程来调度数据库函数以并行运行。

在继续之前,我需要完成 CREATE TABLE 命令。我将如何实现这一目标?

是否有一些标准的方法可以在 node.js 中实现这样的事情?

代码如下:

// npm install sqlite3 - to install sqlite3


const sqlite3 = require('sqlite3').verbose();

let db = initialise_database();

check_and_update(db); //Calling this function upon starting the server.

close_database(db);

console.log('program ended.');


function initialise_database() {
    //Establishing a database connection.
    let db = new sqlite3.Database('database1.db', (err)=>{
        if(err) {
            return console.error(err.message);
        }
    });

//    // new db always succeeds even if no file exists - if empty file have to generate table structure
    db.run("CREATE TABLE IF NOT exists 'mytable' ('num1' INTEGER, 'num2' INTEGER, 'text1' TEXT);", function(err) {
        if (err) {
        console.log("Create table error: ", err);
    }
    console.log("successfully created mytable table");
    });

    console.log("finished initialise_database");
    return db;
}


function check_and_update(db) {
    db.all("SELECT * FROM mytable", function(err, data){
        if(err) {
            console.log("select err: ", err);
        } else {
            db.run('INSERT INTO mytable (num1, num2, text1) VALUES (?, ?, ?)', [1, 2, 'hi guys!!!'], function(err){
            if(err)
                console.log("insert err: ", err);

            });
        }
    });
}


function close_database(db) {
    db.close((err) => {
        if (err) {
            return console.error(err.message);
        }
        console.log('database closed.');    
    });
}

【问题讨论】:

    标签: node.js asynchronous sqlite callback


    【解决方案1】:

    数据库请求是异步的,你必须以异步的方式处理它们。

    可以是:

    • Callback
    • Promise
    • Async/await

    否则您将尝试在未初始化的数据库上执行请求。

    这是一个使用Promise的示例。

    const sqlite3 = require('sqlite3').verbose();
    
    let dbPtr = false;
    
    initialise_database()
      .then((db) => {
        dbPtr = db;
    
        return check_and_update(dbPtr);
      })
      .then(() => {
        close_database(dbPr);
         
        // All is done
    
        console.log('program ended.');
      })
      .catch((err) => {
        // Deal with the error
      });
    
    function initialise_database() {
      return new Promise((resolve, reject) => {
        //Establishing a database connection.
        const db = new sqlite3.Database('database1.db', (err) => {
          if (err) {
            console.error(err.message);
    
            return reject(err);
          }
    
          db.run('...', function(err) {
            if (err) {
              console.log("Create table error: ", err);
    
              return reject(err);
            }
    
            console.log("successfully created mytable table");
    
            return resolve(db);
          });
        });
      });
    }
    
    function check_and_update(db) {
      return new Promise((resolve, reject) => {
        db.all('...', function(err, data) {
          if (err) {
            console.log("select err: ", err);
    
            return reject(err);
          }
    
          db.run('...', [1, 2, 'hi guys!!!'], function(err) {
            if (err) {
              console.log("insert err: ", err);
    
              return reject(err);
            }
    
            return resolve();
          });
        });
      });
    }
    
    
    function close_database(db) {
      db.close();
    }

    @EDIT

    查看documentation 似乎db.close() 不带回调参数。我已经修改了 sn-p。

    【讨论】:

    • 您的代码确实创建了数据库并插入数据正常。但我很困惑,在评论下 // All is done 我希望程序结束。要打印。但事实并非如此。知道为什么不?
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2013-03-25
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多