Я хочу изменить существующего пользователя в узле. Мой передний конец находится в мопсе. В моей таблице пользователя много полей (от 20 до 25), а некоторые из них должны быть уникальными, например, электронная почта и имя пользователя, и у меня есть функции, чтобы проверить, не являются ли они дубликатом.
Я только хочу обновить значения, которые изменились на клиенте, моя форма редактирования уже имеет значения пользователя, конечно.
Я думал, что лучший способ достичь этого - проверить все входы от req.body, и если он отличается от любых пользовательских значений, я должен его обновить. (Возможно, какие-то разные методы? Не могу ли я проверить, загрязнены ли входы?)
Это может быть ситуация. Обратите внимание на объект req.body со значениями, которые моя таблица пользователя не имеет, например password_confirm
req.body = {
username: 'test',
email: '[email protected]',
password: '1234',
password_confirm: '1234',
location: 'New York',
website: 'new-website.com',
bio: undefined,
expertise: 'New expertise'
}
user = {
username: 'test',
email: '[email protected]',
password: '1234',
location: 'San Fransico',
website: 'website.com',
bio: null,
expertise: null
}
Теперь я хочу обновить поля измененных местоположений, веб-сайтов и специалистов. Я пробовал много вещей, используя сокращение и lodash, но я не могу получить поля, которые я ищу.
NB Я уже проверял различные вопросы StackOverflow, но ничего не работает для моей ситуации.
Я понял.
На основании ответа @ponary-kostek & @anuragasaurus это то, что сработало для меня:
const differences = {};
Object.keys(req.body).forEach((key)=> {
if(req.body[key].length == 0) req.body[key] = null;
if(stakeholder.hasOwnProperty(key) && stakeholder[key]!=req.body[key]){
differences[key] = req.body[key];
}
});
Это возвращает объект с измененными ключами и их значениями.
Поскольку поля из моего пользовательского объекта извлекаются из базы данных SQL, они равны нулю. Кроме того, пустые поля тела не определены, а строки. Значение, если вход пуст, это пустая строка, и для сравнения с моим пользовательским объектом она должна быть сначала нулевой.
Спасибо всем за их ответы.
Из того, что я понял из вашего вопроса, попробуйте,
Object.keys(req.body).forEach((key)=>{
if(user[key] && user[key]!=req.body[key]){
user[key] = req.body[key];
}
})
Если вам нужен объект diff, используйте это:
function diff(oldObject, newObject) {
const diff = {};
Object.keys(oldObject).forEach((key) => {
if (oldObject[key] != newObject[key] && newObject[key] !== undefined) {
diff[key] = newObject[key];
}
});
return diff;
}
var body = {
username : 'test',
email : '[email protected]',
password : '1234',
password_confirm : '1234',
location : 'New York',
website : 'new-website.com',
bio : undefined,
expertise : 'New expertise'
}
var user = {
username : 'test',
email : '[email protected]',
password : '1234',
location : 'San Fransico',
website : 'website.com',
bio : null,
expertise : null
}
function diff(oldObject, newObject) {
const diff = {};
Object.keys(oldObject).forEach((key) => {
if (oldObject[key] != newObject[key] && newObject[key] !== undefined) {
diff[key] = newObject[key];
}
});
return diff;
}
console.log(diff(user, body));
Ну, я думаю, вы слишком усложняете. Для этого вам даже не нужен lodash
.
Object.assign({}, user, req.body);
будет работать, поскольку вы сами сказали, что у вас могут быть разные поля в req.body
.