【问题标题】:JS Functions to make an API call用于进行 API 调用的 JS 函数
【发布时间】:2020-05-06 18:58:12
【问题描述】:

我有以下代码。

我正在尝试通过 since (obj.since) 进行 API 调用(检索),因此,每次我进行调用时,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 并将其传递给对象(选项)?

【问题讨论】:

    标签: javascript node.js mongodb api request


    【解决方案1】:

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

    • findOne 更改为末尾有exec,以便它返回承诺
    • 如果没有指定回调,article.create 已经返回了一个承诺。
    • 将请求转换为承诺样式。
    • 使用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 函数。可能有一些语法错误,但你会明白的。

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2014-08-24
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多