每次我 运行 配置文件都不起作用

Every second time I run the config file it doesn't work

我正在使用 node.js w/ PSQL,以及 express 和 node-postgres。我有一个名为 config.js 的文件。目的是让它删除数据库,然后在每次 运行 时将其与表一起重新创建。这每两次都有效,另一半时间返回错误,而不是重新创建数据库。

(node:11300) UnhandledPromiseRejectionWarning: error: database "abc" does not exist

有人知道怎么回事吗?请告诉我是否需要包括完整的错误消息,我没有这样做,因为它似乎不是很有用。

代码:

const { Pool, Client } = require('pg')

let dbName = "abc"

let tables = [{
    name: "users",
    content: "id SERIAL, username VARCHAR, email VARCHAR, passcode VARCHAR"
}]

let pool = new Pool({
    user: 'postgres',
    host: 'localhost',
    database: 'postgres',
    password: 'postgres',
    port: 5432
})

deleteDb()
createDbAndTables()

function deleteDb() {
    pool.query("DROP DATABASE IF EXISTS abc", (err, res) => {

        if (err) {

            console.log(err)
        } else {

            console.log("deleted db " + dbName)
        }
    })
}

function createDbAndTables() {
    pool.query("CREATE DATABASE abc", (err, res) => {

        console.log("created db " + dbName)

        const client = new Client({
            host: 'localhost',
            port: 5432,
            user: 'postgres',
            password: 'postgres',
            database: dbName,
        })

        client.connect()

        for (let i = 0; i < tables.length; i++) {

            let table = tables[i]

            client.query("CREATE TABLE " + table.name + "(" + table.content + ")", (err, res) => {
                if (err) {

                    console.log(err)
                } else {

                    console.log("created table " + table.name)
                }
                if (i == tables.length) {

                    client.end()
                }
            })
        }
        pool.end()
    })
}

如果我做错了什么或可以进行优化,我也很想听听他们的意见。 提前感谢您的帮助!

这里有一个非常快速和肮脏的方法来确保你的函数 deleteDbcreateDbAndTables 运行 按顺序排列:

const { Pool, Client } = require('pg');

let dbName = 'abc';

let tables = [
  {
    name: 'users',
    content: 'id SERIAL, username VARCHAR, email VARCHAR, passcode VARCHAR',
  },
];

let pool = new Pool({
  user: 'postgres',
  host: 'localhost',
  database: 'postgres',
  password: 'postgres',
  port: 5432,
});

deleteDb().then(() => {
  createDbAndTables();
});

function deleteDb() {
  return new Promise((resolve, reject) => {
    pool.query('DROP DATABASE IF EXISTS abc', (err, res) => {
      if (err) {
        reject(err);
      } else {
        resolve('deleted db ' + dbName);
      }
    });
  });
}

function createDbAndTables() {
  pool.query('CREATE DATABASE abc', (err, res) => {
    console.log('created db ' + dbName);

    const client = new Client({
      host: 'localhost',
      port: 5432,
      user: 'postgres',
      password: 'postgres',
      database: dbName,
    });

    client.connect();

    for (let i = 0; i < tables.length; i++) {
      let table = tables[i];
      client.query(
        'CREATE TABLE ' + table.name + '(' + table.content + ')',
        (err, res) => {
          if (err) {
            console.log(err);
          } else {
            console.log('created table ' + table.name);
          }
          if (i == tables.length) {
            client.end();
          }
        }
      );
    }
    pool.end();
  });
}

请注意,我只对其中一个做出了承诺,但如果你想 运行 之后的事情,你可能必须对两者都做出承诺。 我也没有使用 async / await 因为我假设这不是 运行 在一个函数中并且为了简单起见你没有最新的节点 运行ning.