gpt4 book ai didi

javascript - 无法读取未定义的属性 "responseText"

转载 作者:行者123 更新时间:2023-12-01 16:25:33 27 4
gpt4 key购买 nike

我的 JSON.parse 有问题。在我将 API 调用从 request 更改为 request.Promise.get 后,我收到一个错误 -

TypeError: Cannot read property 'responseText' of undefined

包:

Node-Schedule

Request-Promise

CoinMarketCap API

这是我在 r1 中的数据的问题,还是我根本不明白代码现在出了什么问题。我试图将 responseText 更改为 responseXML 对我来说效果不佳。可能我错过了请求中的逻辑,但我很好奇为什么即使这部分代码之前可以正常工作,也会出现此错误。

代码的问题区域

const j = schedule.scheduleJob('* * * * * *', () => {
requestPromise.get({
uri: 'http://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=API-KEY-HERE',
json: true
resolveWithFullResponse: 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);
});
});

完整代码

var requestPromise = require('request-promise');
const { MongoClient } = require('mongodb');
const schedule = require('node-schedule');
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

const saveToDatabase = function(BTCdata) {
const url = 'mongodb+srv://username: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 requestPromise(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('* * * * * *', () => {
requestPromise.get({
uri: 'http://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=API-KEY-HERE',
json: true
resolveWithFullResponse: 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);
});
});

最佳答案

这里有两个错误:

  1. 在你的 requestPromise() 中,你的响应已经是 JSON,因为你使用了 json: true,所以不需要额外的 JSON.parse () 它。

  2. 在响应本身(在您的情况下为 r1)中,您将没有 target 键。相反,您应该首先使用 r1.body 获取响应的主体,然后根据需要使用主体中的数据。

const j = schedule.scheduleJob('* * * * * *', () => {
requestPromise.get({
uri: 'http://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?CMC_PRO_API_KEY=API-KEY-HERE',
json: true,
resolveWithFullResponse: true,
}).then(r1 => {
// r1.body will contain response from API
const responseData = r1.body;

// do something with responseData
}).catch(err => {
console.log(err);
});
});

要更好地了解您将在 r1.body 对象中得到什么,请参阅 official documentation或者只需将该 API URL 与适当的 key 放入浏览器中,您应该已经看到 JSON 输出。

关于javascript - 无法读取未定义的属性 "responseText",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62279536/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com