节点从所有路径提供相同的资源

时间:2017-03-24 10:17:29

标签: javascript node.js express react-router browser-history

我正在使用React BrowserHistory进行导航。无论URL路径如何,我希望从我的节点服务器提供相同的文件。

我的服务器代码:

const http = require('http');
const path = require('path');
const express = require('express');
const app = express();
const hostname = 'localhost';

app.use(express.static('../public'));

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

const port = process.env.PORT || 8007;
app.listen(port, ()=>{
  console.log('Production Express server running at localhost:' + port)
});

http://localhost:8007 =>工作正常

http://localhost:8007/help =>工作正常

http://localhost:8007/help/faq =>失败

我希望所有网址都返回相同的资源,由../public提供。但是,当未从根请求资源时,似乎express.static不起作用。因此,例如,当浏览器要求<script src="scripts/main.js"></script>时,它认为我想要../public/help/scripts/main.js,而我实际上想要../public/scripts/main.js/。因此,由于express没有找到这样的文件,它会移动到app.get('*'...../public/index.html会在请求脚本时返回<script src="http://localhost:8007/scripts/main.js"></script>文件。

所以,期望的行为是:

  • 为任何路径返回相同的index.html(包含任意数量的子文件夹),让React找出要显示的内容
  • 返回始终相对于路径的资源index.html服务于,而不是相对于URL中的路径

当我在资源请求(I.E. {{1}})中使用绝对路径时,它可以工作,但是显然这样做是不可取的,因为它需要在托管其他地方时进行更改。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以使用该条件进行路由:

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

找到我的工作。

请注意此方法,您的浏览器会为每次调用路线重新加载整个页面。