使用Express

时间:2019-02-21 16:56:58

标签: javascript node.js express

我正在尝试使用Express设置特定的配置,但我一生无法解决如何使所有功能正常运行的问题。我看了很多关于SO的资源和问题,但都没有。我希望我能解释一下我想做的所有事情,以便有人能够指出正确的方向。

这就是我想要的:

  1. 对于sub.domain.com,执行一些逻辑并提供来自/public/sub/的静态文件;
  2. 对于domain.com/sub/,将URL重写为sub.domain.com,然后按照与1中相同的逻辑进行操作;
  3. 对于domain.com,投放/public/中的静态文件。

无论我做什么,都会遇到其中一种问题…… 这是我当前的代码:

(根据Stock Overflaw的答案进行更新)

const baseUrl = '/bundle/cloud/public/', // This is needed as I'm hosting on NodeChef and that's their folder structure
  vhost = require('vhost'), // Also tried with express-subdomain
  express = require('express'),
  routerMain = express.Router(),
  routerSub = express.Router(),
  staticOpts = { extensions: ['html', 'htm'] };

//sub.domain.com
routerSub.use((req, res, next) => {
  console.log('routerSub called');
  next();
});
routerSub.use(express.static(baseUrl + 'sub/', staticOpts));

// domain.com
routerMain.get('/sub', (req, res) => {
  res.redirect('https://sub.domain.com/');
});
routerMain.use(express.static(baseUrl, staticOpts));

// Connect routers
app.use(vhost('sub.domain.com', routerSub));
app.use(routerMain);

以下是结果:

✅ domain.com/          /public/index.html
✅ domain.com/file      /public/file.html
✅ domain.com/sub/      redirect to sub.domain.com/ (but then, see below)
✅ sub.domain.com/      /public/sub/index.html
❌ domain.com/sub/file  /public/sub/file.html (should redirect to sub.domain.com/file)

当调用sub.domain.com/时,我得到4个“ routerSub被调用”日志,这是有道理的,因为html有1个,而css有1个,js有2个,尽管有css和js文件不被读取

/public/sub/index.html中的css标记为<link rel="stylesheet" href="style.min.css">,并且/public/sub/style.min.css存在,所以我不明白为什么找不到它它。另外,我正在指定扩展名,因此无需在'css'上添加staticOpts

更新:仅由于我的浏览器缓存,到达sub.domain.com/时未提供css和js文件。 / facepalm

仍然存在的问题是,当您尝试通过输入文件的完整路径(如domain.com/sub/file.html)访问文件时,它确实为文件提供了服务,应该首先将您重定向到sub.domain.com/file

就这样...

有人知道如何提供帮助吗? 干杯。

1 个答案:

答案 0 :(得分:1)

  

尽管sub.domain.com确实让我/public/sub/index.html了,但我无法获取该页面所需的CSS和JS文件

这可能是由于staticOpts = { extensions: ['html', 'htm'] };造成的,您可能想尝试将'css', 'js'添加到该列表中。

  

我觉得它正在尝试从/ public /

获取静态文件

使用一些console.log来查看调用了哪个处理程序(如果有的话),以及我之前提出的观点不能解决此问题。

  

domain.com/sub/根本不会重定向

我认为您想使用res.redirect而不是res.location(它只设置响应头,而不是HTTP代码)。而且显然您不需要next()

此外,我无法使用router.use(subdomain('sub', routerSub))进行此设置,我认为这是因为router本身并不包含在subdomain调用中*。但是,声明app.use的{​​{1}} instad可以完成这项工作。

*:那里是纯假设,但它们使用“嵌入式”路由器的唯一方法是当它们在进行多级子域时,并且它们最后都没有显示根级路由器(即,没有包装在路由器中的路由器) router.use通话。)

这是您的域重定向的一种可行且简化的模拟:

subdomain

我用// declare stuff const express = require('express'); const subdomain = require('express-subdomain'); const router = express.Router(); const routerSub = express.Router(); const app = express(); // make handlers to be tested routerSub.get('/', (req, res) => { console.log('routerSub called'); res.send('ok'); }); router.get('/', (req, res, next) => { console.log('router called'); res.redirect('http://api.myhost.localdomain:3000'); }); // register everything properly app.use(subdomain('api', routerSub)); app.use(router); // start server app.listen(3000); /etc/hosts指向本地主机设置了myhost.localdomain文件。 (很明显。)

希望这会有所帮助!

编辑

实际上,我只考虑了api.myhost.localdomain,忘了路线本身。这应该有帮助:

subdomain