У меня есть очень простой метод аутентификации. Я пытаюсь удалить loginPassword из объекта item перед отправкой ответа.
Но, к сожалению, он не работает.
const auth = async (req, res) => {
try {
var item = await __auth(req.body.loginId);
if (! item || ! await bcrypt.compare(req.body.loginPassword, item.loginPassword)) {
return res.status(400).send({
type: 'validations.exception',
code: 'users.auth.001',
errors: [{
loginId: 'Invalid `Login id` or `Password`',
loginPassword: 'Invalid `Login id` or `Password`',
}]
});
}
const tokens = __jwtTokens({ loginId: item.loginId });
const authToken = await __updateRefreshToken(item._id, {
tokens: tokens.refreshToken
});
delete item.loginPassword;
return res.send(item);
} catch (error) {
return res.status(400).send({
error
});
}
};
Получен ответ
{
"_id": "645dd4da1bdd4ad4a1f1e91a",
"firstName": "...",
"lastName": "...",
"email": "...",
"emailVerify": null,
"emailVerifiedAt": null,
"mobile": 9876543210,
"mobileVerify": null,
"mobileVerifiedAt": null,
"loginId": "...",
"loginPassword": "REMOVE_THIS_FROM_THE_RESPONSE_OBJECT",
"status": true,
"uuid": "..."
}
Требуемый ответ
{
"_id": "645dd4da1bdd4ad4a1f1e91a",
"firstName": "...",
"lastName": "...",
"email": "...",
"emailVerify": null,
"emailVerifiedAt": null,
"mobile": 9876543210,
"mobileVerify": null,
"mobileVerifiedAt": null,
"loginId": "...",
"status": true,
"uuid": "..."
}
Не уверен, что я делаю неправильно здесь.
вполне вероятно, что если удаление не работает, то Object.defineProperty использовалось с configurable: false для определения объекта, это хорошая практика. Если вы хотите отредактировать объект, вам нужно сначала скопировать его, поместите item = {...item} над строкой удаления, хотя личный идентификатор переместите проверку becrypt в метод __auth, скорее всего, вы используете там только becrypt и связаны с его аутентификацией, тогда это простая проверка if (!item){, и вы можете исключить возврат loginPassword методом __auth, если он больше нигде не используется, я подозреваю, что __auth это просто абстракция





Вы можете сделать это следующим образом:
{loginPassword, ...safeObject} = item
Теперь safeObject — это объект, который вы можете отправить в качестве ответа.
Спасибо @DrHerreman. Но safeObject является точной копией item. Следовательно, это не решает проблему.
Не уверен, почему ответ был удален. Но на самом деле это решило проблему.
Mongoose возвращал объект документа вместо объекта json.
Вот рабочий код:
const auth = async (req, res) => {
try {
var item = await __auth(req.body.loginId);
if (! item || ! await bcrypt.compare(req.body.loginPassword, item.loginPassword)) {
return res.status(400).send({
type: 'validations.exception',
code: 'users.auth.001',
errors: [{
'loginId': 'Invalid `Login id` or `Password`',
'loginPassword': 'Invalid `Login id` or `Password`',
}]
});
}
const tokens = __jwtTokens({ loginId: item.loginId });
const authToken = await __updateRefreshToken(item._id, {
tokens: tokens.refreshToken
});
item = item.toObject();
delete item.loginPassword;
return res.send(item);
} catch (error) {
return res.status(400).send({
error
});
}
};
«Не уверен, почему ответ был удален». скорее всего, он был сгенерирован с помощью ChatGPT или чего-то подобного. Такие ответы могут быть правильными, а иногда и совершенно неверными. Но их сложно отличить, так как они высказаны с таким же авторитетным тоном и выглядят хорошо проработанными на примерах.
Вы не показываете, что такое
itemна самом деле. Например, если это документ Mongoose, вы не можете использовать на немdelete, потому что они не являются обычными объектами.