使用 Restangular 查询节点 api/MongoDB

Query node api/MongoDB with Restangular

我正在学习 MEAN 堆栈。我有一个节点 api 连接到 MongoLab 托管数据库。

api returns 个对象是这样的 (api/messages):

[
  {
  _id: "55074ce3c21903c9cce6d02a",
  name: "some random message",
  __v: 0
  },
  {
  _id: "55074e4a1dad546fcef09769",
  name: "a different message",
  __v: 0
  },
  {
  _id: "55074e4a1dad546fcef09123",
  name: "bingo",
  __v: 0
  }
]

使用 restangular,我获取数据然后绑定到 $scope:

Restangular.all('api/messages').getList().then(function (data){
  $scope.messages = data;
});

在应用程序的一部分中,我只想 query/return 必要的数据 - 像这样:

Restangular.all('api/messages').customGET('', {"q": {"name": "a different message" }}).then(function (data) {
    console.log(data);
});

我只想 return 个包含 X 的对象 - 在本例中,'a different message'。

然而,customGET 方法似乎并没有像我预期的那样工作;我总是得到 所有 个对象。

我怎样才能做到这一点?我一直在搜索和尝试一段时间但没有成功。也许我需要添加一些 api 路由和方法。

任何帮助都是 v.appreciated :)

答案是向 API 发送您想要查询的对象。正确读取查询后,API 可以查询数据库和 return 数据。

这是一个分步示例:

angular控制器

就我而言,我想创建一个查询,其中包含自动生成的数组中的多个项目。为简单起见:

var randomUsernames = [ 
  'bill', 'ben', 'james', 'phil'
];

然后我们为Rest创建一个对象angular:

var objectForRestangular = {
  randomUsernames : randomUsernames
}

现在我们可以休息了angular customGET 承诺:

Restangular.all('api').customGET('messages',  objectForRestangular).then(function (data){
  $scope.items = data;
}, function (err){
  console.warn('oh no!', err);
});

这将生成一个 api 端点,如下所示:

/api/messages?randomUsernames=bill&randomUsernames=ben&randomUsernames=james

节点API

我们可以使用express的req.query来引用路由中的字符串参数:

router.route('/messages')
  .get(function (req, res) {

    var usernames = req.query.randomUsernames;

    console.log('we have ' + usernames.length + ' usernames: ' + usernames)

  });

正在查询数据库

示例对象:

{
  _id: '123123123123123'
  username: 'thor',
  time: '09/08/2015',
  copy: 'hey guys, have you seen this? http://random.org',
  userLikes: [
    {
      username: 'bill',     //check this for a match
      _id: '34567890'
      },
    {
      username: 'ben',      //check this for a match
      _id: '67890132'
    }
  ]
},
{ ... },
{ ... }

我想 return 嵌套数组 userLikes.

中包含查询 randomUsernames 匹配值的任何对象

我正在使用 Mongoose 进行数据库操作,因此我们可以使用 $in operator。它非常适合这样的查询。总计:

router.route('/messages')
  .get(function (req, res) {

    var usernames = req.query.randomUsernames;

    console.log('we have ' + usernames.length + ' usernames: ' + usernames)

    Message.find( { username: { $in: userLikes  } }, function (err, messages) {
      if (err) {
        res.send(err);
      } else {
        res.json(messages);
      }
    });

  });

所以现在您可以使用 Restangular 的 customGET 方法向 API 发送查询,后者查询数据库,然后 returns 数据. :-)

如果有人感兴趣,可以查看此示例以及更多 here

请注意,此答案中的示例只是模拟数据(例如,'messages'、'Message' 等)。