【发布时间】:2020-09-28 06:41:53
【问题描述】:
我正在创建一个脚本,它将自动从 API 接收数据并在特定的 UTC 时间将其存储在 MongoDB 中。
我使用Node-Schedule 在特定时间安排任务。 CoinMarketCap 接收实时数据的API。
问题:我每秒在控制台中收到一个未定义的消息(因为节点调度配置为每秒调用一次代码)。我正在寻找 API 中的任何语法错误或错误,但没有成功。我知道我收到未定义的原因是该函数不返回任何内容。 目前根本不知道它有什么问题。 所有 API 密钥和数据库用户名密码都正确,我也检查了它。
目标:让脚本自动从 API 接收数据并将其存储到 MongoDB 集合中。
完整代码
const { MongoClient } = require('mongodb');
const schedule = require('node-schedule');
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
const saveToDatabase = function(BTCdata) {
const url = 'mongodb+srv://name:password@cluster0-1kunr.mongodb.net/<dbname>?retryWrites=true&w=majority';
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
if (err) throw err;
const dbo = db.db('Crypto');
const myobj = { Name: 'BTC', Volume: 'BTCdata' };
dbo.collection('Crypto-Values').insertOne(myobj, (error, res) => {
if (error) throw error;
console.log('1 document inserted');
db.close();
});
});
};
function request(method, url) {
return new Promise(((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.onload = resolve;
xhr.onerror = reject;
xhr.send();
}));
}
const j = schedule.scheduleJob('* * * * * *', () => {
request(
'GET',
'http://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=API-KEY-HERE',
)
.then((r1) => {
const x1 = JSON.parse(r1.target.responseText);
const BTCdata = x1.data.find((d) => d.symbol === 'BTC').quote.USD.volume_24h; // creating a variable to store a BTC request from API
console.log(BTCdata);
// Saving to database
saveToDatabase(BTCdata);
})
.catch((err) => {
console.log(err);
});
});
EDIT1: 这是 x1 值的控制台日志。 EDIT2: 缺少这部分 -
var request = require('request');
添加后,我开始在控制台中收到一个新错误:
events.js:287
throw er; // Unhandled 'error' event
^
Error: Invalid URI "GET"
at Request.init
at new Request
at request
at Job.job
at Job.Invoke
at Users/path to node modules/node-schedule
at Timeout.onTimeout
EDIT3:
在用@Sureshprajapati 回答代码更正后。
出现新错误 - TypeError: Cannot read property 'responseText' of undefined
试图自己找到解决方案。仍在寻找任何建议。谢谢。
var requestPromise = require('request-promise');
requestPromise.get({
uri: 'http://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=API-KEY-HERE',
json: true
}).then(r1 => {
const x1 = JSON.parse(r1.target.responseText);
const BTCdata = x1.data.find(d => d.symbol === 'BTC').quote.USD
.volume_24h; // creating a variable to store a BTC request from API
console.log(BTCdata);
// Saving to database
saveToDatabase(BTCdata);
}).catch(err => {
console.log(err);
});
【问题讨论】:
-
什么是 x1 值?可以加个日志检查一下吗?
-
@SureshPrajapati 主要问题已编辑。这是来自 CoinMarketCap 的所有加密货币的数组。附上截图,你可以看看。
-
您能否查看您的记录是否存在于具有精确结构和预期键的数组中?
-
@SureshPrajapati 是的,在我开始为脚本添加调度之前它就可以工作了。以及我忘记添加需求请求。添加 require 请求后,我开始收到一个新错误 - “无效的 URI “GET””。主要问题已编辑,出现新错误。
-
你是说
var request = require('request-promise'); ?