我有以下代码。
我正在尝试进行 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/