我想在Node中编辑现有用户。我的前端是哈巴狗。 我的用户表有很多字段(大约20到25个),有些必须是唯一的,比如电子邮件和用户名,我可以检查它们是否不重复。
我只想更新客户端上已更改的值,我的编辑表单当然已经包含了用户的值。
我认为实现这一目标的最佳方法是检查来自req.body的所有输入,如果它与任何用户值不同,我应该更新它。 (也许有任何不同的方法?我能否检查输入是否“脏”?)
情况可能就是这样。请注意req.body对象,其中包含我的用户表没有的值,例如password_confirm
req.body = {
username: 'test',
email: 'user@user.com',
password: '1234',
password_confirm: '1234',
location: 'New York',
website: 'new-website.com',
bio: undefined,
expertise: 'New expertise'
}
user = {
username: 'test',
email: 'user@user.com',
password: '1234',
location: 'San Fransico',
website: 'website.com',
bio: null,
expertise: null
}
我现在只想更新已更改的位置,网站和专业知识字段。我尝试过很多东西,使用reduce和lodash,但是我无法获得我正在寻找的字段。
NB 我已经检查了不同的StackOverflow问题,但似乎没有任何东西适用于我的情况..
答案 0 :(得分:2)
从我对你的问题的理解,尝试一下,
Object.keys(req.body).forEach((key)=>{
if(user[key] && user[key]!=req.body[key]){
user[key] = req.body[key];
}
})
答案 1 :(得分:1)
如果你需要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 : 'user@user.com',
password : '1234',
password_confirm : '1234',
location : 'New York',
website : 'new-website.com',
bio : undefined,
expertise : 'New expertise'
}
var user = {
username : 'test',
email : 'user@user.com',
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));
答案 2 :(得分:0)
好吧,我觉得你过于复杂了。你甚至不需要lodash
。
Object.assign({}, user, req.body);
会起作用,因为你自己说过req.body
可以有不同的字段。
答案 3 :(得分:0)
我明白了。
基于@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 DB中检索的,所以它们为空。此外,空体字段不是未定义的,而是字符串。意思是如果输入为空,则它是一个空字符串,并且要将它与我的用户对象进行比较,它应该首先为null。
感谢大家的回答。