内部服务器错误 (500) Firebase 托管(无法查找视图)

问题描述 投票:0回答:1

系统:

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目录)

firebase express google-cloud-functions ejs firebase-hosting
1个回答
0
投票

你的

res.render('store', { storeData: storeData });

寻求通过传递一个对象来渲染

store
视图(顺便说一句,您可以简化
{ storeData: storeData }
,如果属性的名称与要分配给它的变量的名称相匹配,这是您可以在 Javascript 中执行的一个技巧)。在
/public/views
内部搜索视图,系统根本找不到要渲染的
store
视图。这就是您设置路径的方式:

app.set('views', path.join(__dirname, '../public/views'));

您需要确保您拥有想要渲染的视图,它位于您期望的位置,执行此代码的用户具有访问该视图的必要权限,并且此处给出的路径是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.