【问题标题】:node.js/express app hosted with digital ocean displays the Cannot get / error使用数字海洋托管的 node.js/express 应用程序显示无法获取/错误
【发布时间】:2018-11-03 21:06:36
【问题描述】:

在网上查看并查看了针对不同情况的无数不同答案后,我仍然找不到适合我的解决方案。当我尝试在本地运行我的 server.js 文件时,它工作正常。但是当我复制我的存储库并尝试在我的 droplet 中运行它时,我收到了这个错误:

Cannot GET /

以下是我的 server.js 代码:

const express = require('express')
const path = require('path')
const history = require('connect-history-api-fallback')

const app = express()

const staticFileMiddleware = express.static(path.join(__dirname + '/dist'))

app.use(staticFileMiddleware)
app.use(history({
  disableDotRule: true,
  verbose: true
}))
app.use(staticFileMiddleware)

app.get('/', function (req, res) {
  res.render(path.join(__dirname + '/dist/index.html'))
})

var server = app.listen(process.env.PORT || 80, function () {
  var port = server.address().port
  console.log('App now running on port', port);
  console.log(path.join(__dirname + '/dist/index.html'));
})

【问题讨论】:

    标签: javascript node.js express digital-ocean


    【解决方案1】:

    我建议从自动生成的 express 项目开始:

    npm install -g express-generator
    express --view=jade new-project-folder-name
    

    ...如果您这样做,那么DEBUG=* node bin/www 将在端口 3000 上启动项目并启用所有调试。

    实际上,您可能实际上并不想在端口 80 上启动您的 express 项目,而是您希望使用合适的 Web 服务器(如 Nginx 或 Apache),然后将其配置为您 express 的反向代理本地端口(如 3000)上的应用程序。还可以使用 UFW 来减少服务器的安全表面积。

    这样,您还可以使用 Lets Encrypt 让 Web 服务器管理所有 SSL 业务,让您的 express 应用程序只关心其业务。

    不过,首先,只需尝试在端口 3000 上启动您的项目并访问http://your-ip-address:3000 的站点,看看您是否会得到不同的结果。如果你这样做了,你可能需要使用互联网来拼凑一个看起来类似于我上面描述的解决方案。 Digital Ocean 的教程在这方面做得很好。

    【讨论】:

    • 它说找不到模块,我没有配置我的应用程序以这种方式运行,我对这种方法非常不熟悉。您能解释一下如何使用 DEBUG=* node bin/www 运行应用程序吗?
    • @Christopher 找不到模块?你在你的服务器上npm install 了吗? node bin/www 正是 npm start 在自动生成的 express 项目中所做的事情,我想你正在使用它。前缀 DEBUG=* 设置 DEBUG 环境变量,以便 express 在运行时输出尽可能多的诊断信息。
    • 现在我再次查看您的代码,这不是一个自动生成的项目。我会修改我的回复。但是您应该考虑将process.env.PORT || 80 更改为process.env.PORT || 3000
    • 我所做的只是复制我的 git 存储库并尝试通过我的 droplet 运行我的代码,它还说除了端口 80 443 和 22 之外的所有端口都被阻止
    • process.env.PORT || 3000对我没用。我应该选择快速生成器选项吗?会不会是它生成一个新文件夹而我必须移动我要服务的文件夹?
    【解决方案2】:

    问题是当我克隆我的存储库时,它没有推送我的 dist 文件夹。所以我的问题的解决方案是创建一个单独的 repo 并手动推送我的 dist 文件夹。然后我使用这个 repo 在我的 droplet 上提供我的应用程序。

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 2014-09-11
      相关资源
      最近更新 更多