Api 更改meteor restivus PUT以实现upsert

Api 更改meteor restivus PUT以实现upsert,api,rest,meteor,upsert,Api,Rest,Meteor,Upsert,我正在将restivus与meteor一起使用,并希望将PUTschemantic更改为upsert // config rest endpoints Restivus.configure({ useAuth: false, prettyJson: false }); Restivus.addCollection("sensor", { excludedEndpoints: ['getAll','deleteAll','delete'], defa

我正在将
restivus
meteor
一起使用,并希望将
PUT
schemantic更改为upsert

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

如何做到这一点?

目前,唯一的方法是在每个采集路线上提供一个自定义的
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实践,并提供足够的灵活性,允许用户在需要的地方使用自定义行为覆盖它。方法是用给定的ID完全替换实体。它不应该生成新实体(这就是
POST
的目的)。对于集合,Restivus只允许您在特定实体上定义
PUT
。在您的示例中,为
PUT/api/sensors/:id
生成了一个端点。如果您没有按
:id
执行
PUT
,那么您可能应该改为使用
POST
(在REST中没有“正确的方法”来执行此操作,但至少您可以
POST
,而不需要
:id

听起来您想要的是一种覆盖集合端点默认行为的方法。这是非常可行的,但是如果你能通过发出一个特性请求,那么我就可以更好地跟踪它了。你可以从这里复制并粘贴你的问题。我将确保为您添加一种在您定义的任何集合终结点的上下文中访问集合的方法


最后,但肯定不是最不重要的一点,我注意到您正在使用v0.6.0,它需要立即更新到0.6.1,以修复现有的错误,该错误阻止您添加现有集合或使用在Restivus中创建的任何集合。这不是预期的行为,已经发布了一个更新。请查看文档。

回答得很好!是的,我很想把PUT改为upsert,但我想快速地把一些东西拼凑起来,不想通过多次往返来确定是否需要先在客户处发布—但我同意,这是正确的做法。