Отфильтровать нежелательные данные из Response

Я работаю над сервисом, который использует restify и mongoose в качестве odm. Ниже приведен ответ службы, который я получаю после вызова БД.

[
    {
        "_id": "5a548b7c025cfcffdd286e0f",
        "createdAt": "2018-01-09T09:29:32.515Z",
        "updatedAt": "2018-01-09T10:59:49.159Z",
        "subject": "Hello buddy.",
        "body": "i am good and fine.",
        "category": "email service",
        "category_id": "232",
        "author": "5a5485834c2274ce5d5e54f8",
        "__v": 0,
        "images": [
            "https://google.com"
        ],
        "email content": [
            {
                "_id": "5a549dcb80a16b2e822357ae",
                "createdAt": "2018-01-09T10:47:39.883Z",
                "updatedAt": "2018-01-09T10:47:39.883Z",
                "body": "my first comment",
                "name": "asdf"
                "password":"312312"
                "__v": 0,
                "photos": []
            }
        ]
}]      
Emails.find({_id: emaiId, author_id: author_id}).
                populate('emailcontent').exec(function(err, listOfEmails) {
                if (err) {
                    console.error(err);
                    return next(
                        new errors.InvalidContentError(err.errors.name.message),
                    );
                }
                res.send(listOfEmails);
                next();

Это малая часть моего ответа. Теперь я не хочу отправлять весь ответ обратно клиенту. Например, имя пользователя, пароль, номер телефона и т. д. Итак, у меня много данных, которые я не хочу отправлять обратно. Как мне сделать это здесь?


person user3336194    schedule 10.01.2018    source источник


Ответы (3)


Удалите эти поля вручную перед отправкой данных обратно:

listOfEmails.forEach(email => {
  // for array properties
  email['email content'].forEach(content => {
    delete content.name;
    delete content.password;
    // ... and so on
  });
  // for usual properties
  delete email._id;
});

res.send(listOfEmails);
person Rango    schedule 10.01.2018

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

const croppedEmails = emails.map( (email) => { body: email.body, ...(rest of needed fields) });

При таком подходе, когда вы добавите новое поле, которое является конфиденциальным, вам не нужно будет добавлять новое удаление, с другой стороны, при добавлении нового общедоступного поля вам также нужно будет добавить его к вышеуказанной функции.

О, и есть также проекция Mongoose, найти, вернуть определенные свойства

person Kieper    schedule 10.01.2018

Вы можете использовать map() для создания новый массив, который вы отправляете в качестве ответа. Используйте delete для удаления полей.

const newListOfEmails = listOfEmails.map((email) => {
  delete email._id;
  delete email.createdAt;
  delete email.updatedAt;

  for (let eIdx = 0; eIdx < email["email content"].length; eIdx += 1) {
    delete email["email content"][eIdx].password;
  }

  return email;
});

res.send(newListOfEmails);
person Mika Sundland    schedule 10.01.2018
comment
этот код не удаляется. Posts.find({category_id: categoryId}). populate ('автор'). listOfPosts.createdAt;res.send(200, listOfPosts);})}); - person user3336194; 12.01.2018
comment
@user3336194 user3336194 Вам нужно создать новый массив с картой, а затем удалить элементы внутри функции карты. Затем вы отправляете новый массив в res.send. - person Mika Sundland; 12.01.2018