如何在 Node 和 Elm 应用程序 (Heroku) 中启用 URL 路由?

How to enable URL routing in Node and Elm application (Heroku)?

我在 Heroku 上有一个 elm 应用程序 运行。

我不想使用第三方的 elm buildpack,所以我在本地编译了 elm 文件并将 elm.js 推送到 Heroku 服务器上。

我的应用程序正在使用 Node.js 后端,所以我在 expresss 中使用此代码来 发球 index.html:

if(process.env.NODE_ENV === 'production') {
  app.use(express.static('client'));

  app.get('*', (res:any) => {
    res.sendFile(path.resolve(__dirname, 'client', 'index.html'));
  });
}

我可以使用 heroku URL 并且一切正常。如果我单击内部 /login link,我将被重定向到 login 页面并且我的 url 更改为 ww.mywebsite.com/login内部路由不是我的问题。

这是我的问题: 虽然内部路由有效,但如果我在导航栏中手动写入 www.mywebsite.com/login,而不是看到 login页面,我看到 Internal Server Error

我该如何解决这个问题?我需要一个 heroku buildback 来完成这个吗?

正如评论中的@kaskelotti 指出的那样,Internal Server Error 正在打印是因为正在找到文件,但是一旦找到文件就会发生另一个错误。如果没有找到文件,我会收到 404 错误。

这是我的 express 代码中的一个语法错误,它将所有请求与我的静态 index.html 文件相匹配。

我的问题中发布的代码是错误的,它应该是这样的:

if(process.env.NODE_ENV === 'production') {
  app.use(express.static('client'));

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

区别在于app.get中回调函数的参数。最初它是 (res) 而不是 (req, res),因此 res 变量被误认为是 Request 而不是 Response 类型的对象,因为它是第一个参数.

另外正如@kaskelotti 所指出的,Heroku 与这个问题无关。