强制程序执行,直到功能完成

时间:2019-08-17 11:09:08

标签: javascript node.js

我正在尝试与数据库建立连接,并且希望看到在尚未建立连接的情况下我的代码停止执行。因此它可以在正确的时间(在程序输出启动成功之前)向控制台打印错误/成功消息。

我当前建立连接的代码是:

dbConnectAsync = async () => {
  try {
    await mongoose.connect("mongodb://localhost:27017/meetstation", { useNewUrlParser: true });
    console.log(SUCCESS_MSG);
  } catch (err) {
    console.log(ERROR_MSG);
    console.log(err.name);
  }
}

我知道可以将所有其他代码放在try块中,但这不是所希望的,因为我计划将建立数据库连接的功能移至另一个文件。

是否有任何方法可以调用该函数来强制其他代码执行等待该函数执行完毕?

3 个答案:

答案 0 :(得分:0)

在您的代码中,您可以等待dbConnectAsync,然后在成功建立连接后运行。因此,代码将出现在单独的try / catch块中,而不出现在dbConnectAsync的内部try / catch中。

async function program() {
    try {
        await dbConnectAsync();
        // code that executes after successful connection
    } catch (err) {
        // handle connection error
    }
}

我要提到的一个更改是在throw的catch块中使用dbConnectAsync,以便任何使用代码的都可以响应它。我上面的示例不会因此收到任何错误。

答案 1 :(得分:0)

您可以将数据库设置功能提取到模块中:

// db.js
let connection;

export async function setup() {
  try {
    connection = await mongoose.connect('mongodb://localhost:27017/meetstation', { useNewUrlParser: true });
    console.log(SUCCESS_MSG);
  } catch (err) {
    console.log(ERROR_MSG);
    console.log(err.name);
  }
}

export function getConnection() {
  return connection;
}

初始化连接,然后启动您的应用程序:

// main.js
import { setup, getConnection } from './db.js';

(async function bootstrap() {
  await setup();

  // start your application
  // using getConnection()
})();

答案 2 :(得分:0)

实际上,如果没有数据库,您的服务器将无法完成很多工作。因此,发生错误时最适当的反应就是崩溃。使用top-level await,我只需要编写一个这样的模块:

  export * from "mongoose";
  import { connect } from "mongoose";

  await connect("mongodb://localhost:27017/meetstation", { useNewUrlParser: true });

然后,每当您使用猫鼬时,请从该文件而不是从"mongoose"本身导入它。这样,在数据库准备就绪之前,任何代码都不会运行,并且在发生错误的情况下服务器确实会崩溃。