改变流星restivus PUT实现upsert

时间:2015-02-20 00:51:03

标签: api rest meteor upsert

我将restivusmeteor一起使用,并希望将PUT原理图更改为upsert。

  // config rest endpoints
  Restivus.configure({
    useAuth: false,
    prettyJson: false
  });
  Restivus.addCollection("sensor", {
    excludedEndpoints: ['getAll','deleteAll','delete'],
    defaultOptions: {},
  });

如何做到这一点?

1 个答案:

答案 0 :(得分:1)

目前,执行此操作的唯一方法是在每个收集路线上提供自定义PUT端点:

Restivus.addCollection(Sensors, {
  excludedEndpoints: ['getAll','deleteAll','delete'],
  endpoints: {
    put: function () {
      var entityIsUpdated = Sensors.upsert(this.urlParams.id, this.bodyParams);
      if (entityIsUpdated) {
        var entity = Sensors.findOne(this.urlParams.id);
        return {status: "success", data: entity};
      }
      else {
        return {
          statusCode: 404,
          body: {status: "fail", message: "Sensor not found"}
        }
      }
    }
  }
});

Restivus的目标是默认提供最佳的REST实践,并具有足够的灵活性,允许用户根据需要使用自定义行为覆盖它。 proper RESTful behavior of PUT将完全替换具有给定ID的实体。它永远不应该生成一个新的实体(这是POST的用途)。对于集合,Restivus仅允许您在特定实体上定义PUT。在您的示例中,为PUT /api/sensors/:id生成端点。如果你没有按PUT进行:id,那么你可能应该使用POST代替(在REST中没有“正确的方法”来做到这一点,但至少你可以{ {1}}不需要POST)。

听起来你想要的是一种覆盖集合端点的默认行为的方法。这是非常可行的,但如果您通过Restivus GitHub Issues发出功能请求,这对我有帮助,因此我可以更好地跟踪它。你可以从这里复制并粘贴你的问题。我将确保为您在您定义的任何集合端点的上下文中添加一种访问集合的方法。

最后,但同样重要的是,我注意到您正在使用v0.6.0,需要立即更新到0.6.1以修复现有错误,这会阻止您添加现有集合或使用Restivus中创建的任何集合。 。这不是预期的行为,并且已发布更新。查看more on that的文档。