我的要求是我希望能够通过$ http.post从我的angular-app发送一个像{title: "test", price: undefined}
这样的对象到我的nodejs应用程序(为了能够通过我的Mongoose更新删除价格键) MongoDB的)。
问题:
代码提取
console.log(object)
$http.post(url, object)
{title: "test", price: undefined}
{title: "test"}
==>为什么我的有效载荷不包含完整的对象?如何添加价格:我的有效负载中未定义?
答案 0 :(得分:3)
当HTTP请求Content-Type
为application/json
且有效负载对象包含undefined
时,某些字段为'值,这些字段将被删除。否则,服务器端程序无法成功解析JSON - 将发生错误SyntaxError: Unexpected token u in JSON at position ...
(令牌u
只是" u"""""""" 34;未定义&#34)。
这不是Angular特定行为,所有HTTP请求都应具有此逻辑。
Angular' $http.post
会发生什么?
在Angular中,所有请求数据都将被转换。当数据为JSON时,将调用toJSON
(等于angular.toJson
)来完成工作(source code):
transformRequest: [function(d) {
return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d;
}]
toJson()
函数只是JSON.stringify
(source code)的代理:
function toJson(obj, pretty) {
if (isUndefined(obj)) return undefined;
if (!isNumber(pretty)) {
pretty = pretty ? 2 : null;
}
return JSON.stringify(obj, toJsonReplacer, pretty);
}
如果未定义,在转换过程中遇到函数或符号,则省略(当在对象中找到它时)或者删除为null(当在数组中找到它时)。
答案 1 :(得分:1)
它不包含它,因为它是undefined
。从请求中删除未定义的变量。你只需要知道服务器端,如果没有包含变量,你应该删除它。通常,您希望使用PUT
动词更新记录,而使用POST
来创建新记录。
您可以发送空字符串或布尔值或特殊内容,以便您在节点应用中知道删除密钥。