Я тестирую получение данных о погоде API (open weather map.org) с помощью JavaScript и XMLHttpRequest.Я использую страницы Github в качестве своего тестового сайта.Мне нужен JSON.parse, чтобы включить информацию.в объект JS, но JSON.parse всегда является проблемой.Я боролся с этим сообщением об ошибке:
Uncaught SyntaxError: Unexpected token l in JSON at position 0
at JSON.parse (<anonymous>)
at data.weather.forEach.weather (scripts.js:29)
at Array.forEach (<anonymous>)
at XMLHttpRequest.request.onload (scripts.js:22)
Я прочитал в нескольких потоках поддержки, что это ошибка на стороне сервера, и посмотрел на вкладке сети - я сделал, и все имеет статус 200 !?Я также прочитал в нескольких потоках, что это означает, что JSON не возвращается.Но либо нет упоминания о том, как это исправить, либо я понятия не имею, о чем они говорят.Я новичок в этом и застрял с сообщениями об ошибках в течение нескольких недель.Я единственный разработчик в моем стартапе и должен решить это в ближайшее время.Будем благодарны за любые рекомендации.
scripts.js:
// Whole-script strict mode syntax
'use strict';
const app = document.getElementById("root");
const logo = document.createElement("img");
logo.src = "logo.png";
const container = document.createElement("div");
container.setAttribute("class", "container");
app.appendChild(logo);
app.appendChild(container);
var request = new XMLHttpRequest();
request.open("GET", "https://api.openweathermap.org/data/2.5/weather?
q = London & APPID = 3190 b3e074868b6189a94a8795afa8a2 ", true);
request.onload = function() {
// Begin accessing JSON data here
'use strict';
var data = JSON.parse(this.response);
if (request.status >= 200 && request.status < 400) {
data.weather.forEach(weather => {
const card = document.createElement("div");
card.setAttribute("class", "card");
const h1 = document.createElement("h1");
h1.textContent = weather.title;
const p = document.createElement("p");
weather.description = JSON.parse(weather.description).substring(0, 300);
p.textContent = `${weather.description}...`;
container.appendChild(card);
card.appendChild(h1);
card.appendChild(p);
});
} else {
const errorMessage = document.createElement("marquee");
errorMessage.textContent = `Hug it, it's not working!`;
app.appendChild(errorMessage);
}
}
request.send();
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>You are Techy Job Listings</title>
<link href="https://fonts.googleapis.com/css?family=Dosis:400,700"
rel="stylesheet">
<link href="style.css" rel="stylesheet">
</head>
<body>
style.css:
* {
box-sizing: border-box
}
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: 'Dosis', sans-serif;
line-height: 1.6;
color: #666;
background: #F6F6F6;
}
#root {
max-width: 1200px;
margin: 0 auto;
}
h1 {
text-align: center;
padding: 1.5rem 2.5rem;
background-image: linear-gradient(120deg, #fbc2eb 0%, #a6c1ee 100%);
margin: 0 0 2rem 0;
font-size: 1.5rem;
color: white;
}
p {
padding: 0 2.5rem 2.5rem;
margin: 0;
}
.container {
display: flex;
flex-wrap: wrap;
}
.card {
margin: 1rem;
background: white;
box-shadow: 2px 4px 25px rgba(0, 0, 0, .1);
border-radius: 12px;
overflow: hidden;
transition: all .2s linear;
}
.card:hover {
box-shadow: 2px 8px 45px rgba(0, 0, 0, .15);
transform: translate3D(0, -2px, 0);
}
@media screen and (min-width: 600px) {
.card {
flex: 1 1 calc(50% - 2rem);
}
}
@media screen and (min-width: 900px) {
.card {
flex: 1 1 calc(33% - 2rem);
}
}
.card:nth-child(2n) h1 {
background-image: linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%);
}
.card:nth-child(4n) h1 {
background-image: linear-gradient(120deg, #ff9a9e 0%, #fecfef 100%);
}
.card:nth-child(5n) h1 {
background-image: linear-gradient(120deg, #ffc3a0 0%, #ffafbd 100%);
}