我正在尝试使用angular $ http.post方法将更新的对象发送到使用mongoose的node.js后端。
我有一个用例,用户可以使字段未定义,这是好的,最终应该让mongoose从mongo文档中取消设置该字段。
问题是angular.js $ http.post实际上只是不发送任何未定义其值的字段。
这是我的行,例如:
return $http.post(`/api/update`, {
field1: 1,
field2: 'hey',
field3: undefined
});
如果我再使用开发人员工具查看,我会看到发送的对象只包含2个第一个字段。
如何使$ http发送未定义的字段?
答案 0 :(得分:0)
undefined
不是JSON的一部分。根据{{3}},JSON的有效值类型为:string
,number
,object
,array
,true
,false
和null
,没有undefined
。
但是,如果您确实要向后端发送undefined
值,则可以覆盖JSON.stringify
,因为Angular的$http.post
最终会使用JSON.stringify
来转换JavaScript请求数据中的对象(代码跟踪请参考json.org):
let oldStringify = JSON.stringify;
let newStringify = function(obj) {
let varsOfUndefined = [];
for (let k in obj) {
if (obj[k] === undefined) {
varsOfUndefined.push(k);
}
}
let str = oldStringify(obj);
if (varsOfUndefined.length === 0) {
return str;
}
str = str.substr(0, str.length-1);
for (let v of varsOfUndefined) {
str = str + ',"' + v + '":undefined';
}
str = str + '}';
return str;
};
// when send request using $http.post
JSON.stringify = newStringify;
let o = {
x: 42,
y: 'ui',
z: undefined,
d: 'ppp'
};
$http.post('/api/temp', o);
// revert to original JSON.stringify
setTimeout(function() {
JSON.stringify = oldStringify;
console.log(JSON.stringify(o));
}, 0);
这样,请求有效负载将是:
{"x":42,"y":"ui","d":"ppp","z":undefined}
请注意:在后端,您需要定义相应的newParse
函数,JSON.parse
不能直接用于解析上面的字符串。