heroku 是否有一种方法可以使用同一个端点将文件提供给浏览器,并将数据提供给REST请求?

cld4siwp  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(144)

我已经按照这个7 hour tutorial创建了一个blog,几乎到了。有一个步骤我跳过了,因为我不想使用教程中建议的单独的客户机/服务器托管。相反,我有一个单独的heroku服务器,它为公共服务器之外的客户机提供服务:

const app = express();
app.use(express.static('public'))
app.use('/posts', postRoutes);
app.use('/user', userRoutes)

您可以看到,该应用程序还为/posts/user路径提供了一些rest请求,但是,该教程还引导我将这些路径添加到url客户端。
例如,您可以访问我的应用程序(https://blog-tutorial-888.herokuapp.com),但您将立即被“重定向”到(https://blog-tutorial-888.herokuapp.com/posts)。
我说“重定向”是因为在客户端,它看起来像是在那个站点,目的是让你可以做一些事情,比如导航到下一页,这将是在(https://blog-tutorial-888.herokuapp.com/posts?page=2)。
但是如果你真的去到这些链接,或者刷新页面,你会看到rest请求的结果,这是一个巨大的文本块(这显然是因为我有app.use('/posts', postRoutes))。
有没有办法解决这个问题?在这个端点上同时服务html和rest请求?

f3temu5u

f3temu5u1#

要使用单个服务器通过REST API提供前端和数据,您需要区分路径,例如,通过向URL添加/api来获取数据,如下所示:

app.use('/api/posts', postRoutes);
app.use('/api/user', userRoutes);

然后,在所有/api处理程序下面添加以下行,以便对于每个其他请求,您都发送加载React包的HTML:

app.get("/*", (req, res) => {
  // Make sure it's the correct path to the build folder
  res.sendFile(path.join(__dirname, "../client/build/index.html"));
});

当然,不要忘记在您的前端查询url中添加/api,而不是路由设置:

fetch("/api/posts")
// or
axios.get("/api/posts")

相关问题