首页 > 解决方案 > 调用异步函数 main 的正确方法?

问题描述

我有一些 nodejs 脚本 - 即完成工作并完成而不是连续运行的进程。

我使用异步函数,例如:

const mysql = require('mysql2/promise');
...

async function main() {
    var conn = await mysql.createConnection(config.mysql);
    ...
    var [response, error] = await conn.execute(`
        DELETE something
        FROM some_table
        WHERE field = ?
    `, [value]);
    ...

是以下代码:

main().then(() => process.exit(0)).catch(err => { console.error(err); process.exit(1); });

开始执行异步代码的最佳/正确方法?

(它有效,但我想确保我不会留下任何可能导致意外的漏洞,例如被默默吞下的异常。)

为什么conn.execute() 返回一个error(我需要手动检查)而不是抛出一个?

标签: javascriptnode.jsasync-awaitnode-mysql2

解决方案


没有必要使用thenwith ,async..await因为它是then.

入口点可以是asyncIIFE (IIAFE):

(async () => {
  try {
    var conn = await mysql.createConnection(config.mysql);
    ...
    var [response] = await conn.execute(`
        SELECT something
        FROM some_table
        WHERE field = ?
    `, [value]);
    ...
    process.exit(0);
  } catch (err) {
    console.error(err);
    process.exit(1);
  }
})();

process.exit(0)如果连接已关闭,也可能不需要。

为什么 conn.execute() 返回错误(我需要手动检查)而不是抛出错误?

启用 Promise 的函数在结果中返回错误不会,也不是常规的。

基于回调对错误execute 使用错误优先回调。基于 Promise 的execute不能抛出错误,因为它返回一个在出错时被拒绝的 Promise。

文档所示,第二个元素是fields而不是error

const [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]);

它可能会返回被拒绝的承诺,如果发生错误,可以用try..catch内部async函数捕获。


推荐阅读