JS Функции для вызова API - PullRequest
       3

JS Функции для вызова API

0 голосов
/ 20 января 2020

У меня есть следующий код.

Я пытаюсь выполнить вызов API (получить), передав , поскольку (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, получив obj.since из базы данных (MongoDB) и передать его объекту (опции)?

1 Ответ

1 голос
/ 20 января 2020

Вы выполняете асин c операцию в стиле обратного вызова в течение l oop, которая вызывает эту проблему. Я поменяю несколько вещей

  • Изменим findOne на exec в конце, поэтому он возвращает обещание
  • article.create уже возвращает обещание, если обратный вызов не указан.
  • Преобразование запроса в стиль обещания.
  • Использование for..of l oop для выполнения асинхронной c операции.

Код будет выглядеть следующим образом

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. Может быть несколько синтаксических ошибок, но вы получите представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...