node.js - 处理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 异步函数?这是正确的方法吗?
你们能以正确的方式重定向我吗?
解决方案
我建议使用第二个选项,或者与第二个选项类似的方法。我相信代码更容易阅读和维护。您最终也会得到代码行数的一小部分。
mysql2和mongodb等很多数据库模块直接返回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]);
}
}
推荐阅读
- python - 如果两个 Tree 具有相同的值节点,则使用 set 计数
- laravel - 查询与 slug 而不是 id 的 hasMany 关系?
- nginx - 如何配置 nginx 反向代理
- batch-file - 如何运行批处理脚本以获取文本文件中的输出
- r - 如何使用 plotweb 二分中的 ifelse() 语句根据交互值更改交互的颜色?
- jquery - Angular 5 Jquery问题
- python - 合并熊猫df中的特定值
- computer-vision - 对象跟踪上下文中的本地和全局数据关联有什么区别?
- sql-server - 如何将 XML 数据列表存储在表中
- javascript - Angular 和浏览器在加载数据方面的限制