javascript - 用于进行 API 调用的 JS 函数

标签 javascript node.js mongodb api request

我有以下代码。

我正在尝试进行 API 调用(检索)并传递 since (obj.since),因此,每次调用时,API 都不会检索所有数据。但是,到目前为止,我还没有找到从数据库中的最后一条记录开始的方法。

var express = require("express");
var article = require("../models/article");
var request = require('request');


article.findOne({}, {since:1, _id:0}, { sort: { 'since' : -1 } }, function (err,obj) { 
         var **dataString** = `'{"consumer_key":"XXXXX", "access_token":"XXXXXXX", "since":"${obj.since}"}'`;

});

var options = {
    url: 'https://xxxxxxxxx.com/v3/get',
    method: 'POST',
    headers: headers,
    body: **dataString**     
    }


function callback(error, response, body) {
    if (!error && response.statusCode == 200) {
        let package = JSON.parse(body);
        for(var attributename in package.list){
            var title = package.list[attributename]["given_title"] ;
            var url = package.list[attributename]["given_url"] ;
            var newArticle = {title: title, url: url, since: since}
            article.create(newArticle, function(error, newlyCreated){
            if(error){
                console.log(error);
            } else {
                console.log(newlyCreated);
            }
        });
    }
    }
    else {
        console.log(error);
    }
};;

request(options,callback)

如何进行 API 调用,从数据库 (MongoDB) 获取 obj.since 并将其传递给对象(选项)?

最佳答案

您正在 for 循环中执行异步回调样式操作,这导致了此问题。我会改变一些事情

  • findOne 更改为在末尾添加 exec,以便返回 Promise
  • article.create 如果未指定回调,则已返回 promise 。
  • 将请求转换为 Promise 样式。
  • 使用for..of循环进行异步操作。

代码如下所示

var express = require("express");
var article = require("../models/article");
var request = require('request');

function hitApi(dataString) {
  return new Promise((resolve, reject) => {
    var options = {
      url: 'https://xxxxxxxxx.com/v3/get',
      method: 'POST',
      headers: headers,
      body: dataString    
    }
    request(options, error, response, body => {
      if (err) {
        reject(err);
      }
      resolve(body);
    });
  });
}


async function perform() {
  const dataString = await article.findOne({}, {since:1, _id:0}, { sort: { 'since' : -1 } }).exec();
  const response = await hitApi(dataString);

  const package = JSON.parse(response.body);
  for (const attributename of package.list) {
      var title = package.list[attributename]["given_title"] ;
      var url = package.list[attributename]["given_url"] ;
      var newArticle = {title: title, url: url, since: since}
      const newlyCreated = await article.create(newArticle);
      console.log(newlyCreated);
  }
}

然后您可以调用perform函数。可能会有一些语法错误,但你会得到一个想法。

关于javascript - 用于进行 API 调用的 JS 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59828840/

相关文章:

javascript - html 中的只读属性与removeAttribute 不一致

javascript - 将表单中的两个值相乘

node.js - Sequelize 中的多对一关联

c#-4.0 - 如何在 C# 中查询 MongoDB 日期时间?

node.js - 24 小时后以 Express 方式删除上传的文件

javascript - 视觉 : Getting the router instance in children components

javascript - Socket.io 在断开连接时重新连接?

node.js - 服务 : Cannot find module './templates.js'

javascript - 如何在 Discord V12 中添加嵌入

node.js - 如何使用 Node JS 和 Mongodb 进行加载测试