NodeJS 等待 axios+nedb 函数 async/await 运行下一个查询

Posted

技术标签:

【中文标题】NodeJS 等待 axios+nedb 函数 async/await 运行下一个查询【英文标题】:NodeJS wait for an axios+nedb function async/await to run next query 【发布时间】:2021-02-10 23:56:51 【问题描述】:

我想在 NodeJS 脚本中使用 Axios + nedb 将来自 API 的数据收集到本地文件中。这是我到目前为止所做的:

var axios = require('axios');
var Datastore = require('nedb');
const fs = require('fs');

db = new Datastore( filename: './../smb_share/art.db', autoload: true );

function getArt(limit, offset) 
    var config = 
      method: 'get',
      url: 'http://IPADD/api/data/2:1/?limit=' + limit + '&offset=' + offset',
      headers:  
        'Accept': 'application/simple+json', 
        'Content-Type': 'application/json', 
        'Authorization': 'Basic XYZ'
      
    ;

    axios(config)
      .then(function (response) 
          response.data.erpDataObjects.forEach(element => 
              var doc =  number:element.head.number,
                          desc:element.head.desc
              ;
              db.insert(doc, function (err, newDoc) 
                if(err =! null)
                  console.log(err);
                   
            );
          );  
      )
    .catch(function (error) 
        console.log(error);
    );  


getArt(1000,0)
getArt(1000,1000)

只要我不从 API 收集更多数据,它就可以正常工作。我需要调用我的函数“getArt(limit, offset)”大约 400 次,因为我从 API 获得了大约 400000 个文档。我尝试使用 intervalTimers 来执行此操作,因此每 5 分钟启动一次函数,并且每次触发间隔事件时 ++offset 为 1000 ......是的,我知道这很奇怪,但这是目前对我有用的唯一方法.但是当API服务器负载很重的时候,一个查询需要的时间太长,超出了调用的限制,结果一团糟。

我的问题:当之前的功能准备好时,我如何保持清晰并触发功能?我尝试了很多异步/等待的东西,但都以错误告终,或者同时被解雇。我基本上需要的是...

getArt(10000,0)
.then
getArt(10000,10000)
.then
getArt(10000,20000)
.then
...

但是使用 axios 的嵌套函数,我不知道如何用 promise 来处理这个问题。谁能给我一个提示?

【问题讨论】:

【参考方案1】:

您是否尝试过将getArt 设置为async function 并简单地将awaiting 设置为?

async function getArt(limit, offset)...

async function Name()
  await getArt(10000, 1000); // wait to complete before moving on
  await getArt(10000, 2000); // only execute when above is done


Name();

通过不分配await 的结果,您只需告诉您的程序等待此函数完成,然后再继续执行下一个函数。

旁注:

为什么不创建一个增加偏移量并调用getArt 函数的for 循环?

async function Name()
  var limit = 10000;
  for(let offset = 0; offset < limit; offset += limit/10)
    await getArt(limit, offset);
  


Name();

我没有对此进行测试,但看不出它为什么不起作用。

此外,(为了遵循良好的实践指南)您应该将您的 await 语句包装在 try-catch 块中以处理如下错误:

try
  await getArt(limit, offset);

catch(err)
  console.error(err);

【讨论】:

谢谢@lbragile,我想我尝试了简单的异步等待函数,但它运行了所有函数调用而不等待前一个。还要感谢旁注,当等待有效时我想做什么。明天我会在生产中再试一次,看看我的实验代码是否有错误。 @Matthias,这里没有加起来,如果你像我提到的那样做了 async/await,那么函数应该在继续下一行之前“等待”响应。你介意分享你的实现吗?你确定你做了 async function getArt(limit, offest)...? SyntaxError: await 仅在异步函数中有效 @Matthias 正如我两次提到的,您需要使用async function getArt(limit, offset) 才能使用await getArt(limit, offset) 感谢您的提示,我检查了两次,我的功能是:async function getArt(limit, offset) ... 这让我感到困惑。

以上是关于NodeJS 等待 axios+nedb 函数 async/await 运行下一个查询的主要内容,如果未能解决你的问题,请参考以下文章

NEDB NodeJS 查找文档并等待结果

如何使用 NodeJS 仅将 NeDB 数据库中的某些字段存储到数组中

NEDB & Nodejs:使用用户输入在 home.db 中搜索特定记录 - 无法将参数传递给 index.js

nedb:如何从 find() 函数中获取文档?

从 javascript promise (expressjs + neDB) 中提取函数

Axios不会在nodejs中返回[重复]