【问题标题】:Making query string parameters to change specific data field for RESTful APIs制作查询字符串参数以更改 RESTful API 的特定数据字段
【发布时间】:2018-04-15 16:11:24
【问题描述】:

我是 RESTful API 的新手,我已经成功地为我的 API 实现了 GET 和 DELETE 方法(POST 上的 GET localhost:4000/api,DELETE localhost:4000/api 工作正常)。

我现在要实现的是指定每个特定字段的排序顺序,其中 1 为升序,-1 为降序。例如,

如果我做 localhost:4000/api/users?sort = { fieldName : 1 }

这将返回按“fieldName”排序的用户列表。

我试过了

router.get('/', function(req, res) {
  var sort = req.query.sort;

  user
   .find({})
   .sort({"name": sort}) 
   .exec(function(err, users) {
      if(err){
          res.status(404).send({
              message: err,
              data: []
          });
      } else {
          res.status(200).send({
              message: 'OK',
              data: users
          });
      }
  });
});

但由于“名称”部分是硬编码的,它只适用于名称。我想让用户指定字段名称并根据它对列表进行排序。

我要补充什么?

编辑:这就是我的数据的样子

{
    "message": "OK",
    "data": [
        {
            "_id": "59faba588f3f6211ac7db43c",
            "name": "Kim2",
            "email": "kk2@gmail.com",
            "__v": 0,
            "dateCreated": "2017-11-02T06:25:28.225Z",
            "pendingTasks": []
        },
        {
            "_id": "59facf56e8c5663343d4b644",
            "name": "Minnie Payne",
            "email": "minnie@gmail.com",
            "__v": 0,
            "dateCreated": "2017-11-02T07:55:02.552Z",
            "pendingTasks": []
        },
        {
            "_id": "59fb699c3c00c60990fa6edb",
            "name": "jerry watson",
            "email": "jerry@wgmail.com",
            "__v": 0,
            "dateCreated": "2017-11-02T18:53:16.637Z",
            "pendingTasks": []
        }, ...

EDIT2

  user
   .find({})
   .sort('name') 
   .exec(function(err, users) {
      if(err){
          res.status(404).send({
              message: err,
              data: []
          });
      } else {
          res.status(200).send({
              message: 'OK sorted',
              data: users
          });
      }
  });

【问题讨论】:

  • req.query 项目都是“字符串”。如果您希望 JSON 中的对象作为参数值,请使用 JSON.parse。即.sort({ name: JSON.parse(req.query.sort) }) 其中req.query.sort 是“字符串”'{ "fieldName": 1 }'。注意 JSON 需要引用的“键”。
  • 抱歉,您能否在答案中详细说明您的解决方案?我想我明白了,但我真的不明白如何在代码中执行此操作。

标签: node.js rest api sorting


【解决方案1】:

您要做的是用字符串命名对象属性。 为此,您可以执行以下操作:

var string = 'name'
var obj = {}
obj[string] = 'val'
console.log(obj) // {name: 'val'}

所以,在你的例子中:

router.get('/', function(req, res) {
  var sort = req.query.sort;
  var name = req.query.name;
  var obj = {}
  obj[name] = sort

  user
   .find({})
   .sort(obj) 
   .exec(function(err, users) {
      if(err){
          res.status(404).send({
              message: err,
              data: []
          });
      } else {
          res.status(200).send({
              message: 'OK',
              data: users
          });
      }
  });
});

编辑:使用 localhost:4000/api/users?sort={fieldName: 1} 的解决方案

router.get('/', function(req, res) {
  let obj = JSON.parse(req.query.sort)

  user
   .find({})
   .sort(obj) 
   .exec(function(err, users) {
      if(err){
          res.status(404).send({
              message: err,
              data: []
          });
      } else {
          res.status(200).send({
              message: 'OK',
              data: users
          });
      }
  });
});

【讨论】:

  • 但这不是对字段“名称”进行硬编码吗?我想直接在 URL 上指定字段名称。例如localhost:4000/api/users?sort={fieldName: 1} 其中 fieldName 可以是任何现有字段,例如“name”、“id”、“date”等。
  • 这正是代码的作用!看第 3 行。名称变量取自查询字符串
  • 谢谢!我刚试过,但似乎没有排序。我真正想要的是根据排序查询的值是 -1 还是 1(1- 升序;-1 - 降序)进行排序。这样localhost:3000/api/users?sort={"name": 1} 就会按升序对名称进行排序。
  • 如果要在查询字符串中直接传递{"name":1},则需要解析字符串。所以 obj = JSON.parse(req.query.fieldname)
  • 没有。我向你提出了两个解决方案。第一个(在我的回答中,编辑了您的代码)您可以通过这种方式使用您的 api:localhost:3000/api/users?name=yourkey&sort=1。然后,我的第二条评论我提出了一个基于您的查询字符串格式的替代解决方案(您想发送到服务器 localhost:3000/api/user?sort={yourkey: 1}。在这种情况下,您应该使用 JSON.parse(req. query.sort)。这将创建一个对象,您可以将其传递给您的排序函数。这两种解决方案都不是硬编码的,而是从查询字符串中获取您想要排序的键名。
猜你喜欢
  • 2012-06-15
  • 2015-04-19
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多