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