【问题标题】:Hosting nodeJS app with firebase使用 firebase 托管 nodeJS 应用程序
【发布时间】:2014-12-24 16:12:42
【问题描述】:

所以我有这个使用 angularJS 和 nodeJS 的网络应用程序。我不想只使用 localhost 来演示我的项目,因为当我键入“node server.js”然后转到 localhost 时它看起来一点也不酷.....

由于我打算将 Firebase 用于数据,我注意到 Firebase 提供托管。我试过了,但它似乎只托管 index.html 而不是通过/使用 server.js。我已经为服务器定制了文件来使用/更新。那么,如何让 Firebase Hosting 在托管时使用我的服务器和相关文件?

是否可以告诉 Firebase,嘿,运行“node server.js”来托管我的 index.html?

【问题讨论】:

  • Firebase 托管只能托管静态文件。它不会执行您的 node.js(或任何其他)代码。但是,如果您当前的 server.js 只是提供静态文件,那么您可以将它们上传到 Firebase 托管,它会正常工作。如果您的 server.js 做得更多,并且您正在寻找托管此 node.js 代码的位置,那么谷歌搜索就有很多选项(要求这些建议对于 StackOverflow 来说是题外话,因为可能有许多偏好,因为有 SO 用户)。
  • 既然你不想使用 localhost/your_project 因为“它看起来不酷”,请考虑修改你计算机中的 hosts 文件以使任何域(甚至 google.com)指向在您的本地主机上。显然,这个技巧只有在您从计算机上查看网站时才会起作用。 眨眼
  • 现在可以托管节点应用程序 - 请参阅此“重复”问题的答案以及更多最新详细信息:stackoverflow.com/questions/42415677/…

标签: angularjs node.js firebase firebase-hosting


【解决方案1】:

我猜你想从“互联网”看到这个网站的问题的措辞。

这里有两条路可以走。

a) 通过 Firebase 托管服务您的索引。 Firebase 仅托管资产。如果您的 Angular 应用程序是通过 Node 提供的,那么您需要将架构更改为更 SPA-ish

SPA-ish 就像一个索引引导程序,纯粹通过 API 与后端交互。

您可以将 API 服务器托管在更合适的地方,例如通过 Nodejitsu。

b) 通过 Nodejitsu(托管平台)或您自己的虚拟机(由 BuyVM.net 等不同类型的托管公司管理)提供整个服务。

【讨论】:

  • 谢谢。是的,我的最后一个应用程序纯粹是 SPA 风格。这就是为什么我想更多地参与服务器的事情。我将尝试一些 nodeJS 托管的东西。感谢您的快速回复:)
  • 查看此“重复”问题的答案以及更多最新详细信息:stackoverflow.com/questions/42415677/…
【解决方案2】:

另一个想法是,如果您的 nodejs 应用程序独立于 angularjs 应用程序(但是它们使用共享数据并对该数据模型执行操作),您可以将两者分开并仅通过 firebase 连接它们。

Firebase 托管 -> index.html 和必要的 angularjs 文件。

本地(您的 PC)-> server.js 仅连接到 firebase 并触发更改的数据。

我已经为几个项目做到了这一点,这是一种访问外部世界(互联网)的便捷方式,同时通过不盲目打开端口来保持一些类似的安全性。

我可以在朋友家中控制我家的 chromecast

这是我最近项目中的一个示例(我正在尝试制作 DVR)。

https://github.com/onaclov2000/webdvr/blob/master/app.js

var FB_URL = '';
var Firebase = require('firebase');

var os = require('os')
var myRootRef = new Firebase(FB_URL);

var interfaces = os.networkInterfaces();
var addresses = [];
for (k in interfaces) {
    for (k2 in interfaces[k]) {
        var address = interfaces[k][k2];
        if (address.family == 'IPv4' && !address.internal) {
            addresses.push(address.address)
        }
    }
}

// Push my IP to firebase
// Perhaps a common "devices" location would be handy
var ipRef = myRootRef.push({
    "type": "local",
    "ip": addresses[0]
});


myRootRef.on('child_changed', function(childSnapshot, prevChildName) {
   // code to handle child data changes.
   var data = childSnapshot.val();
   var localref = childSnapshot.ref();
   if (data["commanded"] == "new") {
      console.log("New Schedule Added");
      var schedule = require('node-schedule');
      var date = new Date(data["year"], data["month"], data["day"], data["hh"], data["mm"], 0);
      console.log(date);
      var j = schedule.scheduleJob(date, function(channel, program, length){
                 console.log("Recording Channel " + channel + " and program " + program + " for " + length + "ms");
      }.bind(null, data["channel"], data["program"], data["length"]));

      localref.update({"commanded" : "waiting"});
  }
});

当我将 FB_URL 中的“命令”数据更改为“新”时(可以通过 angularjs 非常简单地完成,例如使用 ng-click 操作),它将安排特定日期和时间的录制(目前并非所有功能都真正起作用)。

【讨论】:

    【解决方案3】:

    我可能迟到了,但由于 3 年过去了,现在 Firebase 提供了一个解决方案,形式为 cloud functions 它不是直截了当的,但如果可以稍微重构他们的代码,看起来很有希望

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 2021-04-10
      • 1970-01-01
      • 2017-05-16
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2021-09-17
      相关资源
      最近更新 更多