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

Я работаю над сервисом, который использует 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();

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

4 ответа

@Mikas Я пытался использовать карту и вернуть ответ в res.send(). но свойство ответа не удаляется.

Posts.find({_id: catId}).populate('author')
.exec(function(err, list) {
  if(err) {
    return next(new errors.InvalidContentError(err.errors.name.message),);};
    res.send(200, massageResponse(list, createResponse));
    next();
  });
});
let createResponse = function (list) {
  const trimmedList = list.map((element) => {
    delete element.createdAt;
      return element;
  });
  return trimmedList;
}
let massageResponse = function (list, callback) {
  return callback(list);
}

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

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

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

Да еще и есть проекция мангуста, найди, верни конкретные свойства

Ты можешь использовать 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);

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

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);
Другие вопросы по тегам