如何在Firebase上托管Nodejs/Express后端?

6

我是一名新手,正在学习NodeJs和Firebase。目前,我有一个带有Express的NodeJs项目,并且有以下文件结构:

` + /root
    + /db
       - user.js
    + /domain
       - user.js
    + /node_modules
       - ...
    + /routes
       - routes.js
    - sever.js
    - config.json`

我希望将此托管在Firebase上,但它会添加index.html等文件。如果我尝试使用Cloud函数,则会添加/functions目录,并在其中添加一个'index.js'文件,就像这样:
` + /root
    + /db
       - user.js
    + /domain
       - user.js
    + /functions
       - index.js
    + /node_modules
       - ...
    + /routes
       - routes.js
    - sever.js
    - config.json
    -firebase.json`

我会尝试将我的server.js代码粘贴到index.js中,但是我会遇到来自引用和缺少包的错误。
这是我的index.js代码:
const functions = require('firebase-functions');

var express = require('express');
var bodyparser = require('body-parser');

var app = express();

// Use bodyParser to parse the parameters
app.use(bodyparser.urlencoded({extended: true}));
app.use(bodyparser.json({limit: '10mb'}));

// Call the routes
require('../routes/routes')(app);

exports.api = functions.https.onRequest(app);

我的 routes.js 代码:

var userRoute = require('./users');

//Register routes and link to functions
module.exports = function(app){
    app.post('/register', user.userRoute);
}

我的 firebase.json

{
    "hosting" : {
        "public" : "public",
        "rewrites" : [{
            "source" : "/",
            "function" : "api"
        }]
    }
}

当我通过firebase serve --only functions本地运行时,一切都很完美,但是当我尝试部署时出现了问题。有什么想法吗?
1个回答

5

有一些特殊情况需要这样做。如果必须这样做,是可行的。它在使用Cloud Functions提供动态内容文档中有详细说明。

基本上,您可以通过firebase.json在Firebase Hosting中配置重定向。具体如下:

"rewrites": [ {
  "source": "/myapi", "function": "myapi"
} ],

接下来,你需要在Firebase Functions中配置index.js文件,使其监听该路径下的HTTP请求,例如:

app.get("/myapi", (request, response) => {
  response.set("Cache-Control", "public, max-age=300, s-max-age=2629746");
  var myparam = request.query.item;
    return fetchSomethingFromFirestore(myparam).then((resp) => {
        return response.render("template", {
          myProperty: resp.valueForPugTemplate
        });
    });
});

app.use(function(err, req, res, next) {
  return errorhandler(err, req, res, next);
});

const myapi = functions.https.onRequest((request, response) => {
  if (!request.path) {
    request.url = `/${request.url}`;
  }
  return app(request, response);
});
module.exports = {
  myapi,
};

我认为我已经在我的 firebase.json 和 index.js 中完成了这个任务。但是当我运行“firebase deploy --only functions”时,我会收到“../routes/routes.js”的缺少程序包错误。 - DannSaHa
你在函数目录下的终端中是否已经使用 npm install express -save 安装了 Express?同时,你需要在 index.js 脚本的顶部使用 require 引入它。 - Ronnie Royston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接