【问题标题】:Express: How to implement the JSON APIExpress:如何实现 JSON API
【发布时间】:2016-06-24 17:24:48
【问题描述】:

我有一个非常基本的快速服务器,它只是通过 mongoose 为 webapps 提供模型数据。所以现在由于在我的框架(ember)中 JSON-API 是请求模型数据的新默认适配器,我想知道如何以尊重 JSON API 规范的方式为我的路由实现响应。

我目前的快递路线是这样的。

router.get('/:id', function(req, res, next) {
  postModel.find({ //Mongoose functions
    _id: req.params.id
  }, function(err, doc) {
    res.json({ //returning the doc
      data: doc //within 'doc', the 'type'-key must be added
    });
  });

});

我必须在每个响应对象中包含“类型”的键,以便响应对象看起来像这样:

{
  data:{
    type:"post",
    id:"123",
    title:"test"
  }
}

【问题讨论】:

  • 我不知道快递。您的 get 调用应该是:“/[type]/[id]”。您的帖子模型示例:使用 /posts/123 获取并且返回的对象应如下所示: data:{ type:"posts", id:"123", attributes: {title:"test"} } 就像在 json -api 规范:jsonapi.org/format/#document-resource-objects
  • 是的,我知道这些规则。由于 express 模块/中间件的概念,只要我们在主文件中正确包含这个文件,只使用 ('/:id', 部分是正确的。无论如何,我的(主要)问题是我不知道如何将 type:"posts" 键值对添加到 doc-var 中,这是猫鼬文档请求的结果。我想知道是否有一种舒适的方法可以在 mongodb 中使用已经对应 jsonapi(带有“类型”字段等)的 mongoose 查找记录/文档
  • 哦,抱歉,没理解正确(如前所述,我不知道 express/mongoose)。但也许这个 github 问题有帮助:github.com/Automattic/mongoose/issues/1867
  • 对这个主题有什么新想法吗?有这个路由器助手:github.com/crimsonronin/express-json-api 但我不确定它是否正在积极开发。也许还有其他得到充分支持的解决方案?

标签: json express json-api


【解决方案1】:

如果您在服务器端实现 jsonapi,因为它会被您的 Ember.js 数据自动解析,那么我建议您查看 Ember.js 提供的不同序列化器。它将解决问题。因为以后端提供的任何方式解析数据是客户端的工作,而不是我们必须使后端与客户端兼容:)

【讨论】:

    【解决方案2】:

    这是一个更好的答案。我在 express 中的请求处理程序:

    router.get('/:id', function(req, res, next) {
      Lookup.findById(req.params.id, function(err, result) {
        if (err) {
          res.send({
            error: err
          });
        } else {
          res.send(to_jsonapi(result, 'lookup'));
        }
      });
    });
    

    这会调用一个实用函数,它将 mongoose 结果转换为有效的 jsonapi 结果。您只需要使用结果加上“类型”值来调用它。

    function to_jsonapi(result, type) {
      datajson = [];
      if (Array.isArray(result)) {
        result.forEach(function(item) {
          datajson.push({
            "type": type,
            "id": item._id,
            "attributes": item
          });
        });
      } else if (typeof result === "object") {
        // Happens when there is only one item
        datajson.push({
          "type": type,
          "id": result._id,
          "attributes": result
        });
      } else {
        datajson.push({
          "type": type
        });
      }
      return {
        "data": datajson
      };
    }
    

    这还不完美,但应该能让你走上正轨!

    【讨论】:

    • 感谢您的回答,从那以后您找到新信息了吗?我发现的 json-api 包效果不佳。
    【解决方案3】:

    尝试使用 lean()

    router.get('/:id', function(req, res, next) {
      postModel
        .find({_id: req.params.id})
        .lean()
        .then( docs => {
          _.each( docs, doc => {
            doc.type = "post";
          });
          res.json(data: docs);
        });
    });
    

    【讨论】:

      【解决方案4】:

      我只是遇到了同样的问题。有一个ember-mongoose npm 包,但我还没有使用它。他们解决问题的方法实际上是通过扩展 DS.RESTAdapter 回到 ember-data 端。他们在那里覆盖了 findQuery 函数。

      findQuery: function(store, type, query) {
          var data = { query: query };
          return this.ajax(this.buildURL(type.typeKey), 'POST', { data: data });
        }
      

      这并不是那么优雅,因为它需要对每种数据类型进行自定义。可以看例子here

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        相关资源
        最近更新 更多