gpt4 book ai didi

javascript - Firebase:snapshot.val不是函数或其返回值不可迭代

转载 作者:行者123 更新时间:2023-12-02 23:58:52 25 4
gpt4 key购买 nike

所以我正在使用 Express、Firebase 和 ReactJS 创建一个小型应用程序。我偶然发现了 Firebase snapshot.val 的问题

express 上的这部分代码通过 ID 为我的旅行提供服务并获取所有内容。对于所有行程都工作正常,但是当我尝试进行单次行程时,它会返回此错误

如果我将其解构为数组:

UnhandledPromiseRejectionWarning: TypeError: snapshot.val is not a function or its return value is not iterable

如果我将它解构为一个对象:

TypeError: Cannot destructure property trip of 'undefined' or 'null'.

我完全困惑,找不到解决方案。

这是代码的明确部分:

const firebase = require('firebase');

const reference = () => firebase.database().ref('/trips')

exports.getSingle = async (id) => {
//const snapshot = await reference()
// .orderByChild('id')
// .equalTo(id)
// .limitToFirst(1)
// .once('value');

// const [trip] = snapshot.val();
// return trip
const snapshot = await reference()
.orderByChild('id')
.equalTo(parseInt(id, 10))
.limitToFirst(1)
.once('value');
let trip = [];
snapshot.forEach(function (tripSnapshot) {
tripStorage = tripSnapshot.val();
console.log(tripStorage);
trip.push(tripStorage);
});
console.log(trip);
return trip;
};

exports.getAll = async () => {
const snapshot = await reference().once('value');

return snapshot.val();
};

我正在前端获取行程:

 componentDidMount() {
fetch("/api/trips/get/" + this.state.id)
.then(res => res.json())
.then(trip =>
this.setState({
trip
}, () => console.log("Trips fetched...", trip))
);
}

行程 Controller :

const express = require('express');

const route = express.Router();
const tripUtil = require('../utils/tripUtil');

route.get('/getAll', async (req, res) => {
const trips = await tripUtil.getAll();

res.json(trips);
});

route.get('/get/:id', async (req, res) => {
const { id } = req.params;
const trip = await tripUtil.getSingle(id);

if (trip) {
res.json(trip);
} else {
res.status = 400;
res.json({
error: 'trip not found'
});
}
});

module.exports = route;

并从对象映射属性,如下所示:

 {this.state.trip.itinerary.days.map((day, i) => {
return (
<div key={i} className="trip-single-item__day">
<div className="trip-single-item__day-header">
<div className="trip-single-item__day-title">
{day.title}
</div>
<div className="trip-single-item__day-subtitle">
{day.subtitle}
</div>
<div className="trip-single-item__day-date">
{day.date}
</div>
</div>
<div className="trip-single-item__day-body">
<div className="trip-single-item__day-descritpion">
{day.description}
</div>
</div>
</div>
);
})}

这是单次旅行的图片Single trip in firebase

有什么建议或指示吗?谢谢

最佳答案

Firebase 通常建议不要将数据作为数组存储在实时数据库中(尽管存在一些异常(exception)):https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html

我猜测正在发生的是,由于某种原因,您的快照值没有呈现为数组,而是呈现为带有数字键的对象。原因之一可能是 Firebase 中的键不是严格顺序的,因为如果数据的键以 0 开头且没有间隙,Firebase 只会将数据呈现为数组。

你能试试这个代码看看它是否有效吗?

exports.getSingle = async (id) => {
const snapshot = await reference()
.orderByChild('id')
.equalTo(id)
.limitToFirst(1)
.once('value');

const queryResult = snapshot.val()
console.log(queryResult) // Make note of the object shape here. Make sure there are actually results.

const trip = Object.values(queryResult)[0]
return trip;
};

关于javascript - Firebase:snapshot.val不是函数或其返回值不可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55257495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com