更改 meteor restivus PUT 以实现 upsert

changing meteor restivus PUT to implement upsert

我正在使用 restivusmeteor 并想将 PUT 示意图更改为更新插入。

  // 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 实践,并提供足够的灵活性以允许用户在他们需要的地方使用自定义行为覆盖它。 proper RESTful behavior of PUT 是完全替换给定 ID 的实体。它永远不应该生成一个新实体(这就是 POST 的目的)。对于集合,Restivus 将只允许您在特定实体上定义 PUT。在您的示例中,为 PUT /api/sensors/:id 生成了一个端点。如果您没有通过 :id 执行 PUT,那么您可能应该使用 POST 代替(在 REST 中没有 "right way" 来执行此操作,但至少您可以POST 而不需要 :id)。

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

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

的文档