質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1009閲覧

API通信処理がうまくいかない

ryo666-6

総合スコア3

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/10/27 14:31

前提・実現したいこと

現在、Next.jsとJavaScriptを用いて天気予報のアプリを作成しています。
openweathermap(https://openweathermap.org/)でAPIを発行しています。また予め各都市の緯度経度などをjson形式でまとめた物を別ファイルで用意し、それを様々なファイルで読み込んで利用しています。

検索欄で都市名を打ち込んで表示された都市をクリックした際に、コンソールに緯度軽度を表示させようとしたら、以下のようにエラーが出てしまいます。
イメージ説明

下記に関連するファイルのソースコードを添付いたします。

該当のソースコード

SearchBox.js

import React from 'react' import cities from '../lib/city.list.json' import { useState } from 'react' import Link from 'next/link' export default function SearchBox() { const [query, setQuery] = useState('') const [result, setResult] = useState([]) const onChange = (e) => { const {value} = e.target setQuery(value) let matchingCities = []; if(value.length > 3) { for(let city of cities) { if(matchingCities.length >= 5) { break; } const match = city.name.toLowerCase().startsWith(value.toLowerCase()); if(match) { const cityData = { ...city, slug: `${city.name.toLowerCase().replace(/ /g, '-')}-${city.id}` } matchingCities.push(cityData); } } } return setResult(matchingCities) } return ( <div className='search'> <input type='text' value={query} placeholder='気になる場所は?' onChange={onChange}/> {query.length > 3 && ( <ul> {result.length > 0 ? ( result.map((city) => ( <li key={city.slug}> <Link href={`/location/${city.slug}`}> <a> {city.name} {city.state ? `, ${city.state}` : ''} <span>({city.country})</span> </a> </Link> </li> )) ) : ( <li className='search__no-results'>No results found</li> )} </ul> )} </div> ) }

[city.js]

import React from 'react'; import cities from '../../lib/city.list.json'; export async function getServerSideProps(context) { const city = getCity(context.params.city); const res = await fetch(`https://api.openweathermap.org/data/2.5/onecall?lat=${city.coord.lat}&lon=${city.coord.lon}&appid=${process.env.API_KEY}&units=metric&exclude=minutely`); console.log(city) const data = await res.json(); if(!data) { return { notFound: true }; } console.log(data); const slug = context.params.city; return { props: { slug: slug, data: data } } }; const getCity = param => { const cityParam = param.trim(); const splitCity = cityParam.split('-') const id = splitCity[splitCity.length - 1] if(!id) { return null }; const city = cities.find((city) => city.id.toString() == id) if(!city) { return city } else { return null }; }; const getHourlyWeather = (hourlyData) => { const current = new Date(); current.setHours(current.getHours(), 0,0,0); const tomorrow = new Date(current); tomorrow.setDate(tomorrow.getDate() + 1) tomorrow.setHours(0,0,0,0) } export default function City({slug, data}) { console.log(data) return ( <div> <h1> City page</h1> <h2>{slug}</h2> </div> ) }

上記で述べた、json形式のファイルは大変長いものになっているので、一部のみ抜粋したします。
city.list.json

[ { "id": 833, "name": "Ḩeşār-e Sefīd", "state": "", "country": "IR", "coord": { "lon": 47.159401, "lat": 34.330502 } }, { "id": 2960, "name": "‘Ayn Ḩalāqīm", "state": "", "country": "SY", "coord": { "lon": 36.321911, "lat": 34.940079 } }, { "id": 3245, "name": "Taglag", "state": "", "country": "IR", "coord": { "lon": 44.98333, "lat": 38.450001 } } ]

試したこと

[city.js]にありますように、api内で(https://api.openweathermap.org/data/2.5/onecall?lat=${city.coord.lat}&lon=${city.coord.lon}&appid=${process.env.API_KEY}&units=metric&exclude=minutely);
とあるのですが、coordが読み込まれていないようです。。。

どなたかご教授いただけると幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

[city].jsを読んでみて、getCityの実装に違和感があります。

const getCity = param => { // 略 const city = cities.find((city) => city.id.toString() == id) if(!city) { return city } else { return null }; };

cities.find()でIDが一致しているものを拾い上げているのですが、その先のif!cityで判定しているため、cityが存在しない(undefined)ならcity(undefined)を返し逆にcityが存在するならnullを返す実装になっているように読めます。
returnが逆に思えます。

投稿2021/10/27 15:22

編集2021/10/27 15:24
attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo666-6

2021/10/27 15:49

修正し起動してみたところ、うまく動きました。 なんとなく合っているだろう、と思わずどんなコードも注視したいと思います。 ご教授いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問