【问题标题】:can I create a route that could be use both for serving HTML and REST API?我可以创建一个既可用于提供 HTML 又可用于 REST API 的路由吗?
【发布时间】:2015-11-01 17:13:48
【问题描述】:

好的,这就是场景,据我所知,创建 Web 应用程序有三种方法

  1. 传统方式:从服务器渲染 HTML 页面
  2. 不确定:创建 API 并让用户的浏览器下载 Javascript 应用程序(Angular、React、Ember)获得高度评价 交互式应用程序
  3. 未来:同构网络应用程序,将 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?

【问题讨论】:

    标签: node.js reactjs isomorphic-javascript


    【解决方案1】:

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

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

    但是你可以依赖客户端的请求头来检查他们请求的是 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,其他的不清楚,但是可以设置headers。浏览器通常会请求 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)
    });
    

    【讨论】:

    • 谢谢回复,首先手机有 req.headers.accept.match() 吗?第二个解决方案,正则表达式可能是非常多余的吧?因为假设我有 10 个路由并且都需要一些 mongodb 查询,那么我是否需要创建另外 10 个额外的中间件?
    • req.headers 是客户端创建的HTTP request 的属性,因此它肯定会出现在所有客户端上。 .accept may not be 实际上,在这种情况下你应该这样做req.headers.accept && req.headers.accept.match(…
    • 正则表达式路由的目的是让中间件同时运行:/users/api/users。既然您说编写代码来可能为两者运行相同的查询是多余的,因此可以在它们之前的中间件中为两条路由运行代码。如果您有 10 条路由需要 same mongodb 查询,那么您只需要 1 个这样的中间件即可。如果它们都不同,需要不同的查询代码,那么是的,我看不出前面的中间件的目的。
    • 将尝试您的解决方案,看看它是否可以扩展。谢谢
    猜你喜欢
    • 2015-12-11
    • 2012-04-18
    • 1970-01-01
    • 2020-01-25
    • 2021-03-20
    • 2011-06-21
    • 2017-08-31
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多