【问题标题】:Change root folder of expressjs app更改 expressjs 应用程序的根文件夹
【发布时间】:2018-07-19 18:56:55
【问题描述】:

我正在尝试在 nodejs 中设置 twilio 客户端快速启动应用程序。我使用 nginx 作为反向代理,以便向http://example.com/calls 发出的请求,nginx 将其路由到 localhost:3000,我运行 twilio nodejs 快速入门。问题是 expressjs 期望像我在没有子目录的情况下调用 http://example.com 一样提供文件。

我知道我可以使用 app.get,但我不确定这个特定应用的配置方式。现在它有:

const http = require('http');
const path = require('path');
const express = require('express');
const bodyParser = require('body-parser');

const router = require('./src/router');

// Create Express webapp
const app = express();
app.use(express.static(path.join(__dirname, 'public')));// <-Pretty sure I'm supposed to change something here
app.use(bodyParser.urlencoded({extended: false}));

在 index.js 中,节点运行在

/var/www/example.com/calls/index.js

我认为应该提供的静态内容是在

/var/www/example.com/calls/public/index.html

如何更改此设置以使 express 找到内容?

Nodejs 肯定会收到请求。错误是Cannot GET /calls/ 并且标头X-Powered-By 存在并设置为Express

编辑:

我本来希望按照说明进行操作 here,但我的 at&t 防火墙不允许我进行更改。由于我已经打开了 80 和 443 端口,我决定下一个最佳选择是将应用程序代理到我已经在我的系统上运行的域的子文件夹。到目前为止提供的两种解决方案都允许提供/public 文件夹内的 index.html 文件,但 nginx 无法提供位于同一文件夹中的 js 文件或 css 文件。

app.use('/calls',express.static(path.join(__dirname, '/public')));

目前正在https://example.com/calls 提供 index.html 文件,这很棒。令人讨厌的是 nginx 并没有将 https://example.com/calls/site.css 的请求传递给 nodejs。

如果我添加行

rewrite ^/cawls(.*)$ $1 break;

然后什么都找不到。

这是 nginx 调用。

    location ~/calls(.*)$ {
#        rewrite ^/calls(.*)$ $1 break;
        proxy_pass   http://127.0.0.1:3000;
    }

Herehere 是以前与此问题相关的问题,似乎没有人回答。

【问题讨论】:

  • 我认为这可能是您的 nginx 配置而不是 express 的问题。你是如何设置反向代理的?
  • 嗨,菲尔纳什。我特别标记了这个 Twilio 标签,希望你能找到它。我很高兴你做到了。我认为 Twilio 是一个相关标签,因为 Twilio 人需要了解快速入门应用程序的内部工作原理和依赖关系。任何我知道依赖项和所需结构的应用程序都会相应地编写。
  • 但这与快速入门应用程序的内部工作无关,更多的是关于您正在反向代理到子目录下的 node.js 应用程序。不过,我很乐意提供帮助!
  • 谢谢。只是解释我为什么选择它。 :)

标签: node.js express nginx reverse-proxy


【解决方案1】:

这里是 Twilio 开发者宣传员。

这里的问题是 express 对你的/calls 路由一无所知。它希望在其应用程序根目录提供内容。您可以在应用程序中通过将 /calls 路由附加到静态中间件来解决此问题,如下所示:

app.use('/calls', express.static(path.join(__dirname, 'public')));

但这意味着您的 express 应用程序知道您正在使用 nginx 进行反向代理的其余应用程序。相反,我建议您将您的 nginx 配置更新为代理通行证,但为您的 express 应用去除 /calls 路由。

我猜你有一些看起来有点像这样的 nginx 配置:

location /calls {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header HOST $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://localhost:3000;
    proxy_redirect off;
}

如果你在这个块中添加一行,它应该去掉/calls 路由,以便为你的快速应用程序带来好处。

rewrite ^/calls(/.*)$ $1 break;

如果这些方法有帮助,请告诉我!

【讨论】:

  • 您的解决方案可以正常工作,或者与 gwintrob 的工作方式不同。知道为什么 nginx 不会代理 css 和 js 文件吗? twilio 还需要访问子目录/voice,但我找不到该侦听器的创建位置。
  • 你到底是什么意思?哪种解决方案?有什么不好的?哪些 CSS 和 JS 文件以及它们位于何处?
  • 非常感谢您花时间帮助我。我用更多细节更新了这个问题。我所指的解决方案是您如何通过代理提供内容的答案。两者都允许提供 Twilio 客户端的 index.html。两者都不允许提供客户端依赖项,无论如何我都知道。
  • 如果你尝试直接加载example.com/calls/site.css会得到什么?
  • 不知道你的 nginx location 是不是有问题。您应该使用location /calls/ { 之类的东西获得您期望的行为。另外,您是否还有任何其他location 属性以某种方式与 CSS 或 JS 文件匹配?
【解决方案2】:

我还没有看到express.static 用于 HTML。从路由中提供服务怎么样?

app.get('/', function(req, res) {
  res.sendFile(path.join(__dirname, 'public/index.html'));
})

【讨论】:

  • 感谢您抽出宝贵时间查看问题。最初的问题已经提到我可以使用 app.get,但它弄乱了应用程序的引用。真正的问题是如何告诉 express 根在哪里,以便下游的所有内容都请求适当的资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多