Я пытаюсь получить массив из моей пользовательской базы данных из моего приложения для реагирования. Ответ, который я получаю, представляет собой файл HTML, но я не уверен, почему он не работает, поскольку у меня есть тот же код, который отлично работает для элемента, не являющегося массивом. Вот код:
Клиент:
async function populateFavorite() {
const req = await fetch("http://localhost:3001/api/favorite", {
headers: {
"x-access-token": localStorage.getItem("token"),
},
});
const data = await req.json();
if (data.status === "ok") {
console.info(data.watchlist)
} else {
alert(data.error);
}
}
На данный момент, похоже, это не проходит здесь:
const data = await req.json();
Сервер:
app.get('/api/favorite', async (req, res) => {
const token = req.headers['x-access-token']
try {
const decoded = jwt.verify(token, '<key>')
const email = decoded.email
const user = await User.findOne({ email: email })
return res.json({ status: 'ok', watchlist: user.watchlist })
} catch (error) {
console.info(error)
res.json({ status: 'error', error: 'invalid token' })
}
})
Вот как выглядят данные в базе данных:
{"_id":{"$oid":"627306d86089cb6e720e0e8a"},
"firstName":"Ailany",
"email":"[email protected]",
"coins_owned":[],
"watchlist":["Bitcoin","Serum"],
"dateCreated":{"$date":{"$numberLong":"1651705560381"}},
"__v":{"$numberInt":"0"}
Цель состоит в том, чтобы после рендеринга сайта клиент получил массив элементов в списке наблюдения пользователя, чтобы затем они отображались отдельно в списке.
Любая помощь в этом будет очень признательна!
Да, я получаю пустую HTML-страницу с надписью «Для запуска этого приложения требуется Javascript». Когда я посмотрел на него, он выглядел как пустой файл React index.html.
Тогда, наверное, так оно и есть. Вы не показываете свой бэкэнд, но я предполагаю, что он слишком усердно реализует резервную/SPA/маршрутизацию «принудительного состояния» и обслуживает индексный файл на маршрутах, которые вы намеревались использовать в качестве конечных точек API.
Я обязательно посмотрю еще, но я не думаю, что это проблема. У меня есть метод app.post, который обрабатывает тот же маршрут /api/favorite, который добавляет/удаляет элементы в массив в БД. У этого метода нет проблем, но у меня проблема только при попытке получить данные.
Гораздо проще спутать GET, чем POST, с посещением клиентской страницы, во всяком случае, это поддержка моя теория.
Express использует приоритет при определении маршрутов. У меня был следующий код, размещенный над всеми моими маршрутами получения, поэтому они переопределялись.
app.get("*", function (request, response) {
response.sendFile(path.resolve(__dirname, "../frontend/build", "index.html"));
});
Решение:
Я переместил эти строки кода вниз, чтобы другие маршруты имели приоритет. Теперь я получаю в ответ JSON вместо index.html.
Вы, вероятно, получаете HTML в ответ, поэтому вы смотрели на какая HTML, который вы получаете?