我可以创建一个既可用于服务 HTML 又可用于 REST API 的路由吗?
can I create a route that could be use both for serving HTML and REST API?
好的,这是场景,据我所知,可以通过三种方式创建 Web 应用程序
- 传统方式:从服务器呈现 HTML 页面
- 不确定:创建一个 API 并让用户的浏览器下载
Javascript 应用程序(Angular、React、Ember)获得高度评价
交互式应用程序
- 未来:同构 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)
});
好的,这是场景,据我所知,可以通过三种方式创建 Web 应用程序
- 传统方式:从服务器呈现 HTML 页面
- 不确定:创建一个 API 并让用户的浏览器下载 Javascript 应用程序(Angular、React、Ember)获得高度评价 交互式应用程序
- 未来:同构 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)
});