从Firebase取数据至Node.js客户端,Jade模板无法渲染数据求排查
问题排查与修复方案
嘿,我帮你找出问题所在啦!你的代码主要有两个核心问题:异步操作处理顺序不对,还有数据库引用路径错了,我一步步给你讲清楚:
1. 数据库引用路径错误
从你终端输出的JSON结构来看,数据是存在articles节点下的多个子节点里,每个子节点内才是article对象:
{ '-L32RrW6PaBF162cyfDv': { article: { body: 'Test Body', title: 'Test Title' } }, '-L32UMeos7o2bwtPMVTF': { article: { body: 'test', title: 'test' } } }
但你代码里写了let articlesRef = ref.child('article'),这相当于去articles/article这个不存在的路径找数据,自然拿不到内容!应该直接使用articles根节点的引用。
2. 异步操作未等待完成就渲染模板
ref.once('value')是异步操作,返回的是一个Promise对象,你必须等它拿到数据后,再调用res.render。你之前直接把未完成的Promise传给模板,还没等数据获取就触发了渲染,模板当然无法展示内容。
修正后的路由代码
我用async/await写法帮你调整,逻辑更清晰:
// Add Articles Route router.get('/', async (req, res, next) => { try { // 直接引用articles节点,无需额外child('article') const ref = firebase.database().ref('articles'); // 等待异步操作完成,获取数据快照 const snap = await ref.once('value'); const articlesData = snap.val(); // Firebase返回的是键值对对象,转成数组方便模板循环 const articles = Object.values(articlesData).map(item => item.article); console.log(articles); // 现在能看到整理好的文章数组 res.render('articles', { title: 'Add Article', articles: articles }); } catch (err) { console.error('获取数据失败:', err); next(err); // 把错误传递给错误处理中间件 } })
如果你习惯链式调用,也可以写成这样:
router.get('/', (req, res, next) => { const ref = firebase.database().ref('articles'); ref.once('value') .then((snap) => { const articlesData = snap.val(); const articles = Object.values(articlesData).map(item => item.article); res.render('articles', { title: 'Add Article', articles: articles }); }) .catch((err) => { console.error('获取数据失败:', err); next(err); }); })
调整Jade模板的循环逻辑
你需要在循环里输出文章的具体属性,比如标题和内容,修改成这样:
ul each article in articles li h3= article.title p= article.body
这样调整后,你应该就能正常看到Firebase里的文章内容啦!
内容的提问来源于stack exchange,提问作者Andrew Lee
相关产品推荐
相关产品推荐

