angularjs 1.x:发送{' key' :undefined}和$ http.post

时间:2017-06-15 21:44:49

标签: angularjs http

我的要求是我希望能够通过$ http.post从我的angular-app发送一个像{title: "test", price: undefined}这样的对象到我的nodejs应用程序(为了能够通过我的Mongoose更新删除价格键) MongoDB的)。

问题:

代码提取

console.log(object)
$http.post(url, object)
  1. 在控制台中,我看到:{title: "test", price: undefined}
  2. 我的请求有效负载包含{title: "test"}
  3. ==>为什么我的有效载荷不包含完整的对象?如何添加价格:我的有效负载中未定义?

2 个答案:

答案 0 :(得分:3)

当HTTP请求Content-Typeapplication/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.stringifysource code)的代理:

function toJson(obj, pretty) {
  if (isUndefined(obj)) return undefined;
  if (!isNumber(pretty)) {
    pretty = pretty ? 2 : null;
  }
  return JSON.stringify(obj, toJsonReplacer, pretty);
}

JSON.stringify中:

  

如果未定义,在转换过程中遇到函数或符号,则省略(当在对象中找到它时)或者删除为null(当在数组中找到它时)。

答案 1 :(得分:1)

它不包含它,因为它是undefined。从请求中删除未定义的变量。你只需要知道服务器端,如果没有包含变量,你应该删除它。通常,您希望使用PUT动词更新记录,而使用POST来创建新记录。

您可以发送空字符串或布尔值或特殊内容,以便您在节点应用中知道删除密钥。