#javascript #node.js #express
Вопрос:
Я пытаюсь создать приложение для покемонов, используя vanilla js на интерфейсе и Node/Express js на бэкэнде. Я извлекаю данные из API на бэкэнде и отправляю их на интерфейс, но он отправляет только первый элемент из API.
Я также получаю сообщение об ошибке «Ошибка [ERR_HTTP_HEADERS_SENT]: Не удается установить заголовки после их отправки клиенту»
Результат изображения: результат
app.js
const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const app = express();
const port = 1337;
app.use(cors());
if(process.env.NODE_ENV !== 'test'){
app.use(morgan('combined'));
}
app.use((req, res, next) => {
console.log(req.method);
console.log(req.path);
next();
});
// Hämtade moduler
const index = require('./routes/index');
// Lägg till route
app.use('/', index);
app.use((req, res, next) => {
let err = new Error("Not Found");
err.status = 404;
next(err);
})
app.use((err, req, res, next) => {
if(res.headesSent){
return next(err);
}
res.status(err.status || 500).json({
"errors": [
{
"status": err.status,
"title": err.message,
"detail": err.message
}
]
})
})
app.listen(port, () => {
console.log(`Example API listening on port ${port}!`);
});
index.js
const express = require('express');
const router = express.Router();
const fetch = require('node-fetch');
router.get("/", async (req, res) => {
async function foo(){
await fetch(`https://pokeapi.co/api/v2/pokemon?limit=151`)
.then(response => response.json())
.then(data => {
return getPokemonData(data)
}).catch(error => {
console.log(error);
})
async function getPokemonData(pokemon){
await pokemon.results.map(poke => {
res.json(poke.url)
})
}
}
foo()
});
module.exports = router;
Интерфейс — script.js
const pokemonApplication = {
btnGenerate: document.querySelector('.btnGetPokemon'),
putMain: document.querySelector('.pokemon'),
headingName: document.createElement('h2'),
imgCont: document.createElement('img'),
getPokemon: ()=> {
const getFromApi = async () => {
await fetch('http://localhost:1337')
.then(response => response.json())
.then(data => {
console.log(data);
// const imgPokemon = data.sprites.other['official-artwork']['front_default']
// const namePokemon = data.species.name;
// // Append image
// pokemonApplication.imgCont.src = imgPokemon;
// pokemonApplication.putMain.prepend(pokemonApplication.imgCont)
// // Append name
// pokemonApplication.headingName.append(namePokemon);
// pokemonApplication.putMain.prepend(pokemonApplication.headingName);
})
}
pokemonApplication.btnGenerate.addEventListener('click', getFromApi);
}
}
pokemonApplication.getPokemon();
Комментарии:
1. Почему вы проходите мимо локального сервера, а не получаете данные непосредственно из pokeAPI?
2. @Patfreeze Я делаю этот проект, чтобы ознакомиться с Node/Express js. Поэтому я хочу сделать выборку на бэкэнде и получить ее на интерфейсе.
3. Поэтому я предлагаю вам утешиться. войдите в свой сервер, чтобы убедиться, что вы получили все, что вам нужно, и вам также необходимо повторно отправить информацию в виде строки JSON. С помощью JSON.stringify
Ответ №1:
Карта в javascript будет зацикливать мысли всех покемонов. Клиенту можно отправить только один «res».
Таким образом, первый из них был отправлен, все остальные потерпели неудачу. Вот почему у вас есть ошибка [ERR_HTTP_HEADERS_SENT]
async function getPokemonData(pokemon){
await pokemon.results.map(poke => {
res.json(poke.url) // This is not good
})
}
Что-то похожее на:
async function getPokemonData(pokemon){
const pokUrls = await pokemon.results.map(poke => {
return poke.url
})
res.json(pokUrls)
}
Комментарии:
1. Спасибо за ответ, что я должен использовать, чтобы отправить все элементы, а не только 1?
2. Просто отредактируйте мой пост для аналогичного примера. При необходимости отрегулируйте.
3. Это решило мою проблему. У меня есть еще один вопрос. Я хочу получить дополнительную информацию о каждом покемоне. В функции getPokemonData я использовал fetch(poke.url) для извлечения информации из каждого URL-адреса. Когда я возвращаю его и возвращаю результат.json, он возвращает значение null для каждого элемента.
4. Хорошо, если это решит вашу проблему, добавьте галочку, которая решает ее 😁. Кстати, без кода разобраться сложно… функция console.log () — ваш лучший друг. 😉
5. Я решил другой вопрос, который я задал вам, я продолжал оставаться неопределенным, потому что я не выполнял каждое обещание, которое получал, поэтому я справился с этим через Обещанное.все