首页 > 解决方案 > 处理nodejs数据库异步函数的最佳方法是什么

问题描述

我想要关于如何执行 nodejs-DB 操作的建议

这是我的选择

案例一:当您必须运行多个查询并且前一个查询依赖于后者时

第一种方式

    connection.query(Q1, function(error, results, fields) {
        if (error) {
            throw error;
        }
        console.log(results[0]);
 //call the second query here
        connection.query(Q2, function(error, results, fields) {
        if (error) {
            throw error;
        }
        console.log(results[0]);


    });
    });

或者

在函数中定义第一个查询通过 promise 和 await 函数返回结果

以同样的方式调用第二个查询

使用两个结果

var res1 = await funcName1(params);
var res2 = await funcName2(params);// params deducted from res1

哪一个更好?

案例二:当我们想要调用 select 查询超过 1 次时

并将结果捕获到数组中

最后一个很令人困惑,我是否必须在循环中调用 mysql 异步函数?这是正确的方法吗?

你们能以正确的方式重定向我吗?

标签: node.jsasync-await

解决方案


我建议使用第二个选项,或者与第二个选项类似的方法。我相信代码更容易阅读和维护。您最终也会得到代码行数的一小部分。

mysql2mongodb等很多数据库模块直接返回promise也没什么价值,所以不需要创建包装函数,也就是说你不需要维护funcName1,funcName2..等的负载。

例如使用 mysql2:

const mysql = require('mysql2/promise');
const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'some_user',
    password: '***',
    database: 'test_db'
});

let [users] = await connection.query('select * from users');
let [accounts] = await connection.query('select * from accounts');

console.log( { users, accounts })

如果您希望为通用数据库访问过程创建承诺包装函数,请查看Util.promisify,这可以让您减少样板代码。

例如

const dbQuery = util.promisify(db.query);

然后你可以使用喜欢

let result = await dbQuery(param1, param2...);

只要 db.query 看起来像

db.query(query, callback(err, result))

此外,在循环内查询应该工作得很好,例如:

async function testLoopQuery() {
    for(let organization of organizationList) {
        let [users] = await connection.query('select * from users where org_id = ?', [organization.id]);
    }
}

推荐阅读