gpt4 book ai didi

javascript - NodeJS 函数没有返回数据

转载 作者:行者123 更新时间:2023-11-29 09:55:05 24 4
gpt4 key购买 nike

我正在开发一个简单的天气应用程序,它使用只有城市名称的 mysql 数据库。然后我在数据库中查询所有名称,然后向 openweathermap 的 API 发送请求以获取天气信息。

function getCities() {
con.connect();
con.query(('SELECT city_name FROM cities'), (err, res) => {
console.log(res);
getWeather(cities);
});
};

async function getWeather(cities) {
var data = [];
for (var i = 0; i < cities.length; i++) {
var url = `http://api.openweathermap.org/data/2.5/weather?q=${cities[i].city_name}&units=metric&appid=271d1234d3f497eed5b1d80a07b3fcd1`;
await request(url, (err, res, body) => {
var json = JSON.parse(body);
var weather = {
city: json.name,
temperature: json.main.temp,
description: json.weather[0].description,
icon: json.weather[0].icon
};
data.push(weather);
});
}
console.log(data);
}

getCities() 函数按预期工作并返回所有城市,但错误发生在 getWeather 函数中,特别是以下错误:

Desktop/WeatherApp/node_modules/request-promise-core/lib/plumbing.js:130
throw thrownException;
^

TypeError: Cannot read property 'temp' of undefined
at Request.request [as _rp_callbackOrig] (/home/kristijan/Desktop/WeatherApp/app.js:60:41)
at Request.plumbing.callback (/home/kristijan/Desktop/WeatherApp/node_modules/request-promise-core/lib/plumbing.js:76:39)
at Request.RP$callback [as _callback] (/home/kristijan/Desktop/WeatherApp/node_modules/request-promise-core/lib/plumbing.js:46:31)
at Request.self.callback (/home/kristijan/Desktop/WeatherApp/node_modules/request/request.js:185:22)
at Request.emit (events.js:182:13)
at Request.<anonymous> (/home/kristijan/Desktop/WeatherApp/node_modules/request/request.js:1161:10)
at Request.emit (events.js:182:13)
at IncomingMessage.<anonymous> (/home/kristijan/Desktop/WeatherApp/node_modules/request/request.js:1083:12)
at Object.onceWrapper (events.js:273:13)
at IncomingMessage.emit (events.js:187:15)
at endReadableNT (_stream_readable.js:1094:12)
at process._tickCallback (internal/process/next_tick.js:63:19)

据我了解,它是在从 API 获取结果之前跳转箭头函数的内部?

最佳答案

await 仅当您正在等待的函数结果返回 promise 时才等待异步操作。 request() 函数不会返回 Promise(它与您传递给它的回调一起工作),因此 await 不会等待该结果。您可以使用 request-promise 库,它会返回一个 Promise,并且您不会向其传递回调。

这是一个例子:

const rp = require('request-promise');

async function getWeather(cities) {
let data = [];
for (let i = 0; i < cities.length; i++) {
let url = `http://api.openweathermap.org/data/2.5/weather?q=${cities[i].city_name}&units=metric&appid=271d1234d3f497eed5b1d80a07b3fcd1`;
let body = await rp(url);
let json = JSON.parse(body);
let weather = {
city: json.name,
temperature: json.main.temp,
description: json.weather[0].description,
icon: json.weather[0].icon
};
data.push(weather);
}
console.log(data);
}

注意,您还可以让请求 API 自动为您解析 JSON:

const rp = require('request-promise');

async function getWeather(cities) {
let data = [];
for (let i = 0; i < cities.length; i++) {
let url = `http://api.openweathermap.org/data/2.5/weather?q=${cities[i].city_name}&units=metric&appid=271d1234d3f497eed5b1d80a07b3fcd1`;
let json = await rp({uri:url, json: true});
let weather = {
city: json.name,
temperature: json.main.temp,
description: json.weather[0].description,
icon: json.weather[0].icon
};
data.push(weather);
}
console.log(data);
}
<小时/>

编辑 2020 年 1 月 - request() 模块处于维护模式

仅供引用,request 模块及其衍生产品,如 request-promise现在处于维护模式,不会积极开发以添加新功能。更多推理可以阅读herethis table 中有一个替代方案列表对每一项进行一些讨论。我一直用got()我自己,它从一开始就使用 Promise 构建,并且使用起来很简单。

关于javascript - NodeJS 函数没有返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997979/

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