3

nodejs的新手。我有一个 API 文件夹 - 每当服务器收到 API 请求时 - 它应该执行绑定到该路由的函数。但是 - 每当有非 API 请求时,我希望nodejs服务器提供静态文件,以便 Angular 应用程序将“承担责任”并显示相关组件。这主要反映在当我在一个角度组件中时进行刷新 (F5) 时。

这是我的nodejs相关代码:

app.use("/api", require("./api/v1"));  // This should take care in every API request

我的静态文件位于(部署后)下/site/public/dist/public/,并且有一个 index.html 和 <base href="<app root location>">. 为了简单起见 - 我希望我的应用程序(在构建到产品之后)能够进行刷新并到达相同的组件而不会出现“无法获取”错误

这是我已经尝试过的,但没有多大成功:

app.use('/', express.static(__dirname +'/site/public/dist/public/', { redirect: false }));
app.use('*', (req, res) => 
{
  res.sendFile(__dirname +'/site/public/dist/public/');
 });
4

2 回答 2

3

您需要添加 index.html 以显示 html 文件

尝试使用这样的东西

// For static files
app.use(express.static('%dir_name relative to the file path%'))
// For virtual routes use 
app.use('*', (req, res) => 
{
  res.sendFile(__dirname +'/site/public/dist/public/index.html');
 });

参考https://expressjs.com/en/starter/static-files.html

于 2019-09-02T14:10:43.617 回答
0

可能为时已晚,但也许它可以帮助其他人。如果您想发布静态内容而不丢失已有的 URL 路由(即,可能使用 RouterModule 模块的 Angular 应用程序)。

然后您应该使用“*”通配符定义一个 GET 方法,然后过滤请求以识别它是否正在寻找静态内容。

或者如果它正在您的客户端应用程序中寻找特定的子路由(在这种情况下它应该返回 index.html 文件),那么您的方法应该是这样的:

  router.get('*', (req, res) => {
    var pattern = new RegExp('(.css|.html|.js|.ico|.jpg|.jpeg|.png)+$', 'gi');
    if (pattern.test(req.url)) {
      res.sendFile(path.resolve(__dirname, `../../public${req.url}`));
    } else {
      res.sendFile(path.resolve(__dirname, '../../public/index.html'));
    }
  });
于 2020-07-13T03:14:35.387 回答