如何使angular.js $ http.post发送一个包含未定义字段的对象

时间:2017-04-22 15:37:57

标签: angularjs node.js

我正在尝试使用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发送未定义的字段?

1 个答案:

答案 0 :(得分:0)

undefined不是JSON的一部分。根据{{​​3}},JSON的有效值类型为:stringnumberobjectarraytruefalsenull,没有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不能直接用于解析上面的字符串。