我应该如何向将返回条件结果的koa后端发送GET请求?

时间:2015-06-12 04:38:20

标签: javascript node.js rethinkdb koa

到目前为止,我有这个。它有效,但我不禁想知道是否有更少的黑客。

GET请求:

http://localhost:3100/api/things?matches=%7B%22name%22%3A%22asdf%22%7D

已解码:matches={"name":"asdf"} - 我基本上将数据对象作为GET请求,将密钥作为查询字符串参数名称,将JSON.stringify值作为查询字符串值。

它有效....但我觉得我可以用端点来做得更顺畅:

GET http://localhost:3100/api/things/match/:attr/:value - 但是它非常有限,因为我只能有一个条件。传递上面的整个对象,我可以匹配多个属性。

在Koa方面,它不是太多的额外代码(我正在使用Thinky for RethinkDB):

  /**
   * list
   * list all things
   * @param next
   */
  ctrl.list = function *(next){
    var matches = this.request.query.matches && JSON.parse(this.request.query.matches);

    if ( matches ) {
      var result = yield Thing.orderBy({index: "createdAt"}).filter(function(doc){
        return doc('name').match(matches.name);
      });
    } else {
      var result = yield Thing.orderBy({index: "createdAt"});
    }

    this.body = result;

    yield next;
  };

如果没有查询字符串,则只返回所有结果。

我在这里走在正确的轨道上吗?

1 个答案:

答案 0 :(得分:2)

我相信这是正确的方法。这种方法由Baucis使用,koa-mongo-rest也使用Mongoose。它甚至可以进一步发展。 一个示例网址如:

/api/users?conditions={"name":"john", "city":"London"}&limit=10&skip=1&sort=-zipcode

可以通过以下代码处理:

findAll: function*(next) {
  yield next;
  var error, result;
  try {
    var conditions = {};
    var query = this.request.query;
    if (query.conditions) {
      conditions = JSON.parse(query.conditions);
    }
    var builder = model.find(conditions);
    ['limit', 'skip', 'sort'].forEach(function(key){
      if (query[key]) {
        builder[key](query[key]);
      }
    })
    result = yield builder.exec();
    return this.body = result;
  } catch (_error) {
    error = _error;
    return this.body = error;
  }
}

我很高兴为RethinkDB提供类似的库。