NodeJS中任意数量的数据库调用的常见设计模式是什么?

时间:2017-10-27 08:31:12

标签: node.js

我是NodeJS的新手,我对它的异步默认特性感到困惑。

假设我有一个人们发送字符串的API:

Health Initiatives

Global Steel Slate

Vera Cruz Taste Bud Delight

我需要获取数据库中包含任何这些单词的所有文档。所以我需要为第一个字符串做2个数据库查询,为第二个字符串做3个数据库,对最后一个字符串进行5个查询。

我不明白我的代码应该如何看待。在像PHP这样的语言中,我只需将字符串分解为数组,然后遍历数组,进行数据库调用,然后聚合结果,然后将结果发送给调用API的人。所以在PHP中:

$results = array();
$pieces = explode(" ", "Global Steel Slate");
for ($i=0; $i < count($pieces); $i++) {
  $piece = $pieces[$i];
  $document = database_call($piece); 
  array_push($results, $document);
}
return $results;

我如何在NodeJS中处理这种情况?如何进行任意数量的数据库调用然后聚合结果?

2 个答案:

答案 0 :(得分:2)

对于这种特定情况,您可以在一个查询中执行此操作:

select * from mytable where
    mydata like '%Health%' or
    mydata like '%Initiatives%' or
    mydata like '%Global%' or
    mydata like '%Steel%' or
    mydata like '%Slate%' or
    mydata like '%Vera%' or
    mydata like '%Cruz%' or
    mydata like '%Taste%' or
    mydata like '%Bud%' or
    mydata like '%Delight%';

顺便说一下,这也会显着改善PHP代码。

为了处理多个异步操作,async.js库涵盖了所有可能的设计模式:https://www.npmjs.com/package/async或者您更喜欢promises基于promise的async-q库(它实现了异步中的大多数功能)。 js):https://www.npmjs.com/package/async-q

例如,如果您想要并行查询所有这些单词,请使用async.js:

async.each([
    'Health','Initiatives','Global',
    'Steel','Slate', 'Vera', 'Cruz',
    'Taste', 'Bud', 'Delight'
], asyncFunction, doneFunction)

如果您想将其限制为3个连接,您可以这样做:

async.eachLimit([
    'Health','Initiatives','Global',
    'Steel','Slate', 'Vera', 'Cruz',
    'Taste', 'Bud', 'Delight'
], 3, asyncFunction, doneFunction)

如果每个请求都将数据提供给下一个请求async.waterfall,如果您希望一次处理一个异步流程async.eachSeries等。

答案 1 :(得分:0)

为什么你不做同样的事情?首先,您将使用哪个数据库?

您可以接收一个字符串并将其拆分,然后并行执行多个数据库查询(速度更快)

const words = value.split(' ');

const listOfQueries = words.map((word) => {
    return database.query('SQL QUERY word'); //should return a promise
});

const results = await Promise.all(listOfQueries);

或者你可以做到顺序:

const words = value.split(' ');
let results = [];

for(let i = 0; i < words.length; ++i) {
   results.push(await database.query('SQL QUERY word')); //should return a promise
}

//DO stuff with results...

我希望它有所帮助:)

由于您是Node.js中的新手,并且您可能正在使用MySql,我建议您使用knex.js + Mysql驱动程序(http://knexjs.org/ + https://github.com/mysqljs/mysql),它的完全承诺是兼容的!