【发布时间】:2019-08-10 22:53:52
【问题描述】:
所以我正在使用 Express、Firebase 和 ReactJS 创建一个小型应用程序。 我偶然发现了 Firebase snapshot.val 的问题
express 上的这部分代码是通过 ID 为我的旅行提供服务并获取所有信息。对于所有旅行都很好,但是当我尝试去单次旅行时,它会返回这个错误
如果我将它解构为一个数组:
UnhandledPromiseRejectionWarning: TypeError: snapshot.val is not a function or its return value is not 可迭代
如果我将它解构为一个对象:
TypeError: 无法解构“未定义”的属性
trip或 '空'。
我完全感到困惑,找不到解决方案。
这里是 express 部分代码:
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))
);
}
旅行控制器:
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
有什么建议或方向吗?谢谢
【问题讨论】:
-
为什么将
trip常量放在方括号中?const [trip] = snapshot.val();您是否尝试从snapshot.val()访问属性trip,例如const { trip } = snapshot.val(); -
如果我按照你的建议放置它,那么我会得到 UnhandledPromiseRejectionWarning: TypeError: Cannot destructure property
tripof 'undefined' or 'null'。但我认为这是解构 firebase 对象的正确方法? -
这只是一个问题,而不是一个建议 :) 你能编辑你的帖子并写下错误吗:
it returns me this error and I am totally baffled -
完成,感谢您的提示。我为什么要这样做?当我想一想它是否作为对象存储在 firebase 中时,没有逻辑可以通过方括号访问它,但现在我更加困惑为什么行程未定义。
-
id属性是单个trip对象的嵌套属性吗?如果没有,你可以这样访问它:reference().child(id).once('value')`
标签: javascript node.js reactjs firebase express