【问题标题】:How to correct 404"message:"city not found" open weather api如何更正 404“消息:“未找到城市”开放天气 api
【发布时间】:2020-04-07 21:31:02
【问题描述】:

新手程序员在这里尝试使用 api 制作一个简单的应用程序。到目前为止,我正在使用开放天气地图的 api 和谷歌地理编码器。我已经设置好了,所以用户可以输入一个城市、州、国家甚至大陆,它应该用温度和描述来响应。没什么太花哨的。问题是当用户输入拼写错误的城市或州时,我的应用程序中断并且服务器崩溃。这甚至发生在像老挝这样的国家 - 拼写正确但仍然出现同样的错误。我正在使用和 ejs 文件来显示结果。这是一些代码:

 {"cod":"404","message":"city not found"}

 TypeError: /Users/jamesmolnar/Desktop/NewApps/weather/views/results.ejs:5
 3| <h3>Here are the results:</h3>
 4| <p>
 5|     <% data.weather.forEach(function(result) { %>
 6|         <%= console.log(data.weather) %>
 7|         <%= result.description %>
 8| <% }) %>

Cannot read property 'forEach' of undefined
My app.js file:

 // require("dotenv").config();
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
const request = require("request");


app.set("view engine", "ejs");

app.get("/", (req, res) => {
res.render("index");
});

app.get("/results", (req, res) => {
let query = req.query.search;
let weatherApiKey = "0a79f1c8132aac82c5c086a570df5224";

let weatherUrl =
 "https://api.openweathermap.org/data/2.5/weather?q=" +
 query +
 "&appid=" +
 weatherApiKey;
request(weatherUrl, (err, response, body) => {
 if (!err) {
   let data = JSON.parse(body);
   console.log(body);
   res.render("results", { data: data });
 } else {
   console.log(err);
 }
});

let location = req.query.search;
let geoCodeApiKey = "AIzaSyBrxDkJD5NFSQqKFbc5axWn0sGPg0bRYn8";
let geocodeMapUrl =
 "https://maps.googleapis.com/maps/api/geocode/json?address=" +
 location +
 "&key=" +
 geoCodeApiKey;
request(geocodeMapUrl, (err, response, body) => {
 if (!err) {
   let mapData = JSON.parse(body);
   console.log(body);
 res.render("results", { mapData: mapData });
 } else {
   console.log(err);
 }
});
});

app.listen(PORT, () => {
console.log("Weather App is listening on PORT:", PORT);
});




my results.ejs file
<%- include ("./partials/header") %>

<h3>Here are the results:</h3>
<p>
 <% data.weather.forEach(function(result) { %>
     <%= console.log(data.weather) %>
     <%= result.description %>
<% }) %>
<% let tempInFahrenheit = (data.main.temp * 9/5) - 459.67; %>
<%=Math.floor(tempInFahrenheit)%> degrees outside.
</p>
<div id="map"></div>
<a href="/">Back</a>

<%- include ("./partials/footer") %>

【问题讨论】:

  • 您能否查看此类 API 的文档,它们是否提供了避免拼写错误的选项? - 我会检查这是否可能,或者,对于临时解决方案,一旦出现 404 错误,就相应地处理错误。

标签: javascript api


【解决方案1】:

应用程序崩溃,因为您的模板无法在未定义的result 变量上生成forEach 语句。

一个真正简单的解决方法是将特定模板包装在if 条件中。

<%- include ("./partials/header") %>

<h3>Here are the results:</h3>
<p>
<% if (result && data) { %>
  <% data.weather.forEach(function(result) { %>
    <%= console.log(data.weather) %>
      <%= result.description %>
  <% }) %>
  <% let tempInFahrenheit = (data.main.temp * 9/5) - 459.67; %>
  <%=Math.floor(tempInFahrenheit)%> degrees outside.
<% } %>
</p>
<div id="map"></div>
<a href="/">Back</a>

<%- include ("./partials/footer") %>

如果您拼错了城市名称,则应使用 404。此外,输入老挝会抛出 404,因为它是一个国家/地区名称。

【讨论】:

  • 嗯,试过了。仍然没有运气。在终端中,随机元素不断返回,未定义。在“if”语句中,我尝试了几个不同的条件(结果)、(数据)、(data.weather)。
  • @jpaulMolnar 你应该可以用同样的想法解决它。每次尝试访问未定义变量的属性时,都会出现错误。例如,如果 data 未定义,data.main.temp 将引发错误。因此,只需在使用该变量之前再进行一次条件检查。用我编辑的代码 sn-p 再试一次。
  • 也尝试了第二个 sn-p,但问题仍然存在。我也收到 TypeError: req.next is not a function 消息,尽管我知道这意味着什么。将数据对象传递给 results.ejs 页面似乎有问题。
  • 我实际上能够取得一点进展。我将 get 请求更改为 request-promise 格式,这似乎可以防止服务器因拼写错误而崩溃。但是,如果输入拼写错误,它就会超时。
  • 如果您更新您的问题并添加最新版本的代码,我可能会提供帮助。还包括完整的错误消息。
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2011-11-03
  • 1970-01-01
  • 2021-12-23
  • 2012-09-09
  • 1970-01-01
相关资源
最近更新 更多