系统:
node.js: v18.17.0
npm: v9.8.1
firebase: v12.4.6
OS: Windows 11
Github 存储库:https://github.com/yanivavraham1/cuponim1
问题描述:
我是一名新手 Web 开发人员,并尝试使用
Firebase functions
和 ejs
来学习使用 express.js
。我将此项目部署到 Firebase Emulators
并且它工作正常,我可以看到页面上显示的商店数据(位于 localhost:5000/stores/KSP)。现在,之后我将其部署到Firebase Hosting
,但是当我到达路线时/stores/KSP
你可以自己尝试
我在屏幕上看到 Internal Server Error
并在控制台中看到错误(500)。
在 firebase:functions:log 中,我发现它无法找到视图 store.ejs:
restApi: Error: Failed to lookup view "store" in views directory "/public/views"
这一行让我认为问题可能是1.云功能无法访问公共文件夹2.托管项目中不存在store.ejs。我不知道如何解决它(如果是真的)
函数/index.js:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const express = require('express');
const ejs = require('ejs');
const path = require('path');
admin.initializeApp();
const app = express();
// Serve static assets from the "public" directory
app.use(express.static(path.join(__dirname, '../public')));
// Set the views directory and view engine
app.set('views', path.join(__dirname, '../public/views'));
app.set('view engine', 'ejs');
app.get('/cart', async (req, res) => {
try {
res.render('cart');
} catch (error) {
res.status(500).json({ error: 'Error retrieving store data' + error });
}
});
app.get('/stores/:storeId', async (req, res) => {
const storeId = req.params.storeId;
try {
const snapshot = await admin.database().ref('stores/' + storeId).once('value');
const storeData = snapshot.val();
if (storeData) {
const storeName = storeData.NameEnglish;
res.render('store', { storeData: storeData });
} else {
res.status(404).json({ error: storeId + ' not found ' + storeData });
}
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Error retrieving store data' + error });
}
});
exports.restApi = functions.https.onRequest(app);
我通过将views文件夹移动到functions目录中成功修复了它,但我希望views文件夹处于公共状态,因为我想使用公共文件(在store.ejs中)(无法将它们移动到Functions目录)
你的
res.render('store', { storeData: storeData });
寻求通过传递一个对象来渲染
store
视图(顺便说一句,您可以简化 { storeData: storeData }
,如果属性的名称与要分配给它的变量的名称相匹配,这是您可以在 Javascript 中执行的一个技巧)。在 /public/views
内部搜索视图,系统根本找不到要渲染的 store
视图。这就是您设置路径的方式:
app.set('views', path.join(__dirname, '../public/views'));
您需要确保您拥有想要渲染的视图,它位于您期望的位置,执行此代码的用户具有访问该视图的必要权限,并且此处给出的路径是正确的。