Как сделать вложенные циклы с данными объекта jSON на nodejs

1

Я new use nodejs и mongodb, теперь я создаю restful API, используя nodejs и mongodb. Я хочу использовать стандарт ответа для моего API со стандартом http://jsonapi.org.

Мне нужно предложение заранее, как наилучшим образом сделать это, сделав мой ответ API похожим на следующие данные JSON:

HTTP/1.1 200 OK
Content-Type: application/vnd.api+json

{
  "links": {
    "self": "http://example.com/users"
  },
  "data": [{
    "type": "users",
    "id": 5b647bb8998248235a0aab3c,
    "attributes": {
      "username": "luke",
      "email": "[email protected]",
      "password": "password",
      "hashpassword":"",
      "oldpassword":"$2a$10$eyt6YV6m2JJrebNxvS0iEuxMCubDXratNJ6/XK797IGvepXBdp9Yq",
      "salt":"2q6eN9U0vWFBsIF1MtB5WrgPiB8pldTS",
      "usertype":"bisnis",
      "userstatus":"not aktif"
    }
  }, {
    "type": "users",
    "id": 5b647bdf998248235a0aab3d,
    "attributes": {
      "username": "ken",
      "email": "[email protected]",
      "password": "password",
      "hashpassword":"",
      "oldpassword":"$2a$10$eyt6YV6m2JJrebNxvS0iEuxMCubDXratNJ6/XK797IGvepXBdp9Yq",
      "salt":"2q6eN9U0vWFBsIF1MtB5WrgPiB8pldTS",
      "usertype":"bisnis",
      "userstatus":"not aktif"
    }
  }]
}

У меня проблема с итетерией гнезда при создании вывода, как указано выше. Этот мой код:

const UsersModel = mongoose.model('Users');

//...show list user
exports.listUsers = (req, res) => {
  UsersModel.find({}, (err, result) => {
    if (err) {
      res.send({code: 400, failed: 'Error 400'});
    }
    res.json(result);
  });
};

И это мой результат JSON:

[
    {
        "type": "users",
        "userstatus": "not aktif",
        "_id": "5b647bb8998248235a0aab3c",
        "username": "luke",
        "email": "[email protected]",
        "password": "password",
        "usertype": "bisnis",
        "hashpassword": "$2a$10$eyt6YV6m2JJrebNxvS0iEuxMCubDXratNJ6/XK797IGvepXBdp9Yq",
        "salt": "2q6eN9U0vWFBsIF1MtB5WrgPiB8pldTS",
        "__v": 0
    },
    {
        "type": "users",
        "userstatus": "tidak aktif",
        "_id": "5b647bdf998248235a0aab3d",
        "username": "ken",
        "email": "[email protected]",
        "password": "password",
        "usertype": "personal",
        "hashpassword": "$2a$10$hok988mszyIBiXVNjmfifOiPNzXkBRRRynXJS/0qCkvlaBOQs65MO",
        "salt": "IiMvtVYVqTpZFXmYQIM4IlS6PJFVZ3kw",
        "__v": 0
    }
]

И это мой временный код для моей проблемы.

//...show list user
exports.listUsers = (req, res) => {
    UsersModel.find({}, (err, result) => {
      if (err) {
        res.send({code: 400, failed: 'Error 400'});
      }

      let listData  = [];

      for (let key in result) {
        let data = {};
        let attr = {};

        if (result.hasOwnProperty(key)) {
          data.type = result[key].type;
          data.id = result[key]._id;

          for(let i in result[key]) {

            if(result[key].hasOwnProperty(i)) {
              attr.username = result[key].username;
              attr.email = result[key].email;
              attr.password = result[key].password;
              attr.hashpassword = result[key].hashpassword;
              attr.oldpassword = result[key].oldpassword;
              attr.salt = result[key].salt;
              attr.usertype = result[key].usertype;
              attr.userstatus = result[key].userstatus;
            }
          }

          data.attribute = attr;
          listData.push(data);
        }

      }

      let collections = {
        "meta": {
          "copyright": "Copyright 2018 Kotakku Studio and Lab",
          "authors": [
            "sw. saputra"
          ]
        },
        "link": {
          "self": req.protocol + '://' + req.get('host') + req.originalUrl
        },
        "data": listData
      }

      res.json(collections);
    });
};

Пожалуйста, дайте мне предложение элегантный и лучший способ решить мою проблему, если мой временный код неправильный.

Спасибо заранее.

  • 1
    Вы можете использовать функцию map и извлечь весь код из обратного вызова find. Вы можете применить функцию map к result переменной и удалить for, потому что функция map выполняет итерацию по всему массиву. Посмотрите документацию к карте developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Теги:
express

3 ответа

1
Лучший ответ

Вам необходимо создать правильную схему мангуста в соответствии с вашим требованием и сопоставить res с схемой.

//Schema for users
var UsersSchema = mongoose.Schema({
 links: {
   self: String 
 },
  data:[{
    type: String,
    attributes: {
      username: String,
      .
      .
      .
    }
  }]
})

id для каждого документа в массиве будет автоматически создан MongoDB. Для документов схемы мангуста см. Http://mongoosejs.com/docs/guide.html. Вы также можете проверить этот простой TODO API для справки https://github.com/mkujaggi/node-course-todo-api

1

В этом условии:

if(result[key].hasOwnProperty(i)) {

Вы должны получить доступ к i result[key]:

        if(result[key].hasOwnProperty(i)) {
          attr.username = result[key][i].username;
          attr.email = result[key][i].email;
          attr.password = result[key][i].password;
          attr.hashpassword = result[key][i].hashpassword;
          attr.oldpassword = result[key][i].oldpassword;
          attr.salt = result[key][i].salt;
          attr.usertype = result[key][i].usertype;
          attr.userstatus = result[key][i].userstatus;
        }

И вам не нужны все эти проверки .hasOwnProperty если вы не модифицируете собственные прототипы, которых вы, вероятно, не должны. И особенно для Array, это не обязательно, если вы просто зацикливаете правильно с помощью for вместо for-in.

exports.listUsers = (req, res) => {
UsersModel.find({}, (err, result) => {
    if (err) {
      res.send({
        code: 400,
        failed: 'Error 400'
      });
    }

    let listData = [];

    let data = {};
    let attr = {};

    data.type = result[key].type;
    data.id = result[key]._id;

    for (let i = 0; i < result[key].length; i++) {

        attr.username = result[key][i].username;
        attr.email = result[key][i].email;
        attr.password = result[key][i].password;
        attr.hashpassword = result[key][i].hashpassword;
        attr.oldpassword = result[key][i].oldpassword;
        attr.salt = result[key][i].salt;
        attr.usertype = result[key][i].usertype;
        attr.userstatus = result[key][i].userstatus;
    }

    data.attribute = attr;
    listData.push(data);
  }

}

let collections = {
  "meta": {
    "copyright": "Copyright 2018 Kotakku Studio and Lab",
    "authors": [
      "sw. saputra"
    ]
  },
  "link": {
    "self": req.protocol + '://' + req.get('host') + req.originalUrl
  },
  "data": listData
}

res.json(collections);
});
};
  • 0
    О, я не заметил, что массив находится на верхнем уровне ответа JSON. Внешняя петля должна быть удалена.
1

Я бы сделал что-то подобное, итерации по клавишам (это будет работать динамически, даже если мы не знаем имен ключей)

var test=[
    {
        "type": "users",
        "userstatus": "not aktif",
        "_id": "5b647bb8998248235a0aab3c",
        "username": "luke",
        "email": "[email protected]",
        "password": "password",
        "usertype": "bisnis",
        "hashpassword": "$2a$10$eyt6YV6m2JJrebNxvS0iEuxMCubDXratNJ6/XK797IGvepXBdp9Yq",
        "salt": "2q6eN9U0vWFBsIF1MtB5WrgPiB8pldTS",
        "__v": 0
    },
    {
        "type": "users",
        "userstatus": "tidak aktif",
        "_id": "5b647bdf998248235a0aab3d",
        "username": "ken",
        "email": "[email protected]",
        "password": "password",
        "usertype": "personal",
        "hashpassword": "$2a$10$hok988mszyIBiXVNjmfifOiPNzXkBRRRynXJS/0qCkvlaBOQs65MO",
        "salt": "IiMvtVYVqTpZFXmYQIM4IlS6PJFVZ3kw",
        "__v": 0
    }
]
var listData=[]
test.forEach((obj)=>{
   var tempObj={attributes:{}}; //initialize tempObj
   Object.keys(obj).forEach((key)=>{
     if(key=="_id" || key=="type"){
      tempObj[key]=obj[key];
     }else{
      tempObj.attributes[key]=obj[key];
      }
   })
   listData.push(tempObj);
})

let collections = {
        "meta": {
          "copyright": "Copyright 2018 Kotakku Studio and Lab",
          "authors": [
            "sw. saputra"
          ]
        },
        "link": {
          "self": 'test url'
        },
        "data": listData
      }
console.log(collections)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню