【问题标题】:Undefined in console on GET request in NodeJS在 NodeJS 中的 GET 请求的控制台中未定义
【发布时间】: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'); ?

标签: node.js mongodb


【解决方案1】:

request 原生支持流和回调接口。如果您希望请求返回 Promise,则可以使用替代接口包装器来请求请求。如果您更喜欢使用 Promises,或者如果您想在 ES2017 中使用 async/await,这些包装器会很有用。

request-promise(使用 Bluebird Promises)

这个模块是通过 npm 安装的:

npm install --save request
npm install --save request-promise

根据文档修改您的代码:

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(x1 => {

  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);
});

【讨论】:

  • 它对我有用。非常感谢您解释差异。赞成,确认正确答案!谢谢!
猜你喜欢
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2017-10-25
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多