我可以创建一个既可用于服务 HTML 又可用于 REST API 的路由吗?

can I create a route that could be use both for serving HTML and REST API?

好的,这是场景,据我所知,可以通过三种方式创建 Web 应用程序

  1. 传统方式:从服务器呈现 HTML 页面
  2. 不确定:创建一个 API 并让用户的浏览器下载 Javascript 应用程序(Angular、React、Ember)获得高度评价 交互式应用程序
  3. 未来:同构 Web 应用程序,将 HTML 与来自服务器的客户端技术(Angular、React、Ember)一起呈现。

我打算使用第三种方式,因为加载页面速度更快,但现在的问题是我是否要创建移动应用程序。

我的堆栈:Node.js + React

假设我打算移动,我是否需要复制相同的路由和逻辑? 当前问题

app.get('/users', function(req, res) {
   res.render('index', { message: "Hey Im Jack" });
});

app.get('/api/users', function(req, res) {
   res.json({ message: "Hey Im Jack" })
});

有什么方法可以让我使用一条路由同时为 HTML 和 REST 提供服务?

您最终只能发送 HTML 或 JSON(在 REST 的情况下)。

/api/xxx 路由语法使 JSON 服务的路径更加清晰。

但是你可以根据客户的要求header来检查他们是要求JSON还是HTML

app.get('/users', function(req, res) {
    if (req.headers.accept && req.headers.accept.match(/json/))
        res.json(data);
    else
        res.render('index', data);
});

Angular's $http usually requests json by default,其他的不清楚,但是可以设置header。浏览器通常请求 text/html,但我不确定。

或者,如果您只关心不必重复获取数据的逻辑,您可以在两者之前放置一个中间件:

// regex to match both routes
app.get(/.*users/, function(req, res) {
   res.locals.data = { message: "Hey Im Jack" };
   req.next();
});

app.get('/users', function(req, res) {
   res.render('index', res.locals.data);
});

app.get('/api/users', function(req, res) {
   res.json(res.locals.data)
});