从异步节点模块到单独模块的Node API接收结果
我花了很长时间试图获取API调用的结果,以传递给另一个节点模块的AIP请求。我有一个搜索序列名称并返回该序列名称及其ID的模块。我有另一个节点模块,可以从我的前端表单接受搜索查询。我希望webAPI.js模块将搜索请求传递给thetvdb.js模块,然后将结果发送回最初调用它的webapi.js函数。
到目前为止,我所能获得的只是返回未定义或未决承诺的结果。但是无论我做什么,webAPI.js中返回结果的console.log总是不带信息返回,然后我的thetvdb.js中的console.log将返回我想要的结果。
thetvdb.js
require('dotenv').config();
const fs = require('fs');
const request = require('node-fetch');
const requestURL = require('request');
const bodyParser = require('body-parser');
let scanLocation = 'downloads/'
// The TVDB
const TheTVDB_URL = '';
const TVDB_KEY = process.env.TVDB_API_KEY;
const TVDB_API_VERSION = 'v2.1.1';
const TVDB_AV_HEADER = `application/vnd.thetvdb.${TVDB_API_VERSION}`;
const TVDB = require('node-tvdb');
const tvdb = new TVDB(TVDB_KEY);
exports.getSeriesNameAPI = function (seriesName) {
let results = [];
tvdb.getSeriesByName(seriesName)
.then(response => {
for (let i = 0; i < response.length; i++) {
let series = {
name: response[i].seriesName,
id: response[i].id
}
results.push(series);
// console.log('name:', response[i].seriesName, 'ID:', response[i].id);
};
console.log('TVDB Raw:', JSON.stringify(results));
return JSON.stringify(results);
})
.catch(error => { throw (error) });
};
webAPI.js
require('dotenv').config();
const fs = require('fs');
const express = require('express');
const https = require('https');
const async = require('async');
const fetch = require('node-fetch');
const superagent = require('superagent')
const Router = express.Router;
const bodyParser = require('body-parser').json();
const TVDBapi = require('./thetvdb.js');
// const app = express();
const webAPI = new Router();
webAPI.route('/search/:search').get((req, res) => {
// console.log('WebAPI Results: ', TVDBapi.getSeriesNameAPI(req.params.search));
Promise.resolve(TVDBapi.getSeriesNameAPI(req.params.search)).then(response => {
console.log(response);
})
// async function getSearchResults(req){
// let response = await TVDBapi.getSeriesNameAPI(req.params.search)
// let data = await response
// while(data === undefined){
// if(data === undefined){
// console.log('async is worthless')
// // await res.send(JSON.stringify({'async':'worthless'}))
// } else {
// console.log('I cant belive it actually worked!')
// await console.log('inside Async:', data);
// await res.send(JSON.stringify(data));
// }
// // searchResults = data;
// }
// getSearchResults(req);
// console.log('WebAPI Results: ', getSearchResults(req));
// res.send(JSON.stringify(getSearchResults(req)));
// res.send(JSON.stringify(searchResults));
// console.log('WebAPI Results:', fetch(TVDBapi.getSeriesNameAPI(req.params.search)));
// let results = TVDBapi.getSeriesNameAPI(req.params.search).then(console.log('WebAPI results:', results));
// async function init(req) {
// let results = await TVDBapi.getSeriesNameAPI(req.params.search)
// console.log('WebAPI results:', results);
// }
// init(req);
// async.series(TVDBapi.getSeriesNameAPI(req.params.search), function (err, result) {
// /* this code will run after all calls finished the job or
// when any of the calls passes an error */
// if (err) { return console.log(err) };
// console.log('async result:', result);
// });
// return new Promise((resolve, reject) => {
// const error = false;
// if(!error){
// console.log(TVDBapi.getSeriesNameAPI(req.params.search));
// resolve()
// } else {
// reject('response borked')
// }
// })
});
module.exports = webAPI;
最后,我想将搜索结果返回到前端Web界面。但是我得到的是不确定的。
回答如下:thetvdb.js
exports.getSeriesNameAPI = function (seriesName) {
let results = [];
// return Promise
return tvdb.getSeriesByName(seriesName)
.then(response => {
for (let i = 0; i < response.length; i++) {
let series = {
name: response[i].seriesName,
id: response[i].id
}
results.push(series);
// console.log('name:', response[i].seriesName, 'ID:', response[i].id);
};
console.log('TVDB Raw:', JSON.stringify(results));
return results;
})
.catch(error => { throw (error) });
};
webAPI.js
require('dotenv').config();
const fs = require('fs');
const express = require('express');
const https = require('https');
const async = require('async');
const fetch = require('node-fetch');
const superagent = require('superagent')
const Router = express.Router;
const bodyParser = require('body-parser').json();
const TVDBapi = require('./thetvdb.js');
// const app = express();
const webAPI = new Router();
webAPI.route('/search/:search').get( async (req, res) => {
// console.log('WebAPI Results: ', TVDBapi.getSeriesNameAPI(req.params.search));
try{
//await promise resolve
const response = await TVDBapi.getSeriesNameAPI(req.params.search);
res.json(response)
} catch (err) {
res.json({result:'falure'})
}
})