mongodb JS函数进行API调用

bwleehnv  于 2023-06-29  发布在  Go
关注(0)|答案(2)|浏览(127)

我有以下代码。
我尝试进行API调用(检索),传递since(obj.since),因此,每次我进行调用时,API都不会检索所有数据。然而,到目前为止,我还没有找到从数据库上的最后一条记录中获取since的方法。

  1. var express = require("express");
  2. var article = require("../models/article");
  3. var request = require('request');
  4. article.findOne({}, {since:1, _id:0}, { sort: { 'since' : -1 } }, function (err,obj) {
  5. var **dataString** = `'{"consumer_key":"XXXXX", "access_token":"XXXXXXX", "since":"${obj.since}"}'`;
  6. });
  7. var options = {
  8. url: 'https://xxxxxxxxx.com/v3/get',
  9. method: 'POST',
  10. headers: headers,
  11. body: **dataString**
  12. }
  13. function callback(error, response, body) {
  14. if (!error && response.statusCode == 200) {
  15. let package = JSON.parse(body);
  16. for(var attributename in package.list){
  17. var title = package.list[attributename]["given_title"] ;
  18. var url = package.list[attributename]["given_url"] ;
  19. var newArticle = {title: title, url: url, since: since}
  20. article.create(newArticle, function(error, newlyCreated){
  21. if(error){
  22. console.log(error);
  23. } else {
  24. console.log(newlyCreated);
  25. }
  26. });
  27. }
  28. }
  29. else {
  30. console.log(error);
  31. }
  32. };;
  33. request(options,callback)

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

dnph8jn4

dnph8jn41#

你正在for循环中执行异步回调风格的操作,这导致了这个问题。我会改变一些事情

  • findOne更改为在末尾有exec,以便它返回promise
  • article.create已经返回了一个承诺,如果没有指定回调。
  • 将request转换为promise样式。
  • 使用for..of循环进行异步操作。

代码如下所示

  1. var express = require("express");
  2. var article = require("../models/article");
  3. var request = require('request');
  4. function hitApi(dataString) {
  5. return new Promise((resolve, reject) => {
  6. var options = {
  7. url: 'https://xxxxxxxxx.com/v3/get',
  8. method: 'POST',
  9. headers: headers,
  10. body: dataString
  11. }
  12. request(options, error, response, body => {
  13. if (err) {
  14. reject(err);
  15. }
  16. resolve(body);
  17. });
  18. });
  19. }
  20. async function perform() {
  21. const dataString = await article.findOne({}, {since:1, _id:0}, { sort: { 'since' : -1 } }).exec();
  22. const response = await hitApi(dataString);
  23. const package = JSON.parse(response.body);
  24. for (const attributename of package.list) {
  25. var title = package.list[attributename]["given_title"] ;
  26. var url = package.list[attributename]["given_url"] ;
  27. var newArticle = {title: title, url: url, since: since}
  28. const newlyCreated = await article.create(newArticle);
  29. console.log(newlyCreated);
  30. }
  31. }

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

展开查看全部
oknwwptz

oknwwptz2#

我有一个基于API响应数据多次调用相同API的问题。我是如何做的解释如下,请检查是否适合你

  • 方法一

https://deepuvijayan.wordpress.com/2023/06/08/js-making-repeated-api-call-based-on-api-response/

  • 方法二

https://deepuvijayan.wordpress.com/2023/06/10/js-making-repeated-api-call-based-on-api-response-method-2/

相关问题