当错误消息是对象时,如何在javascript中创建新的错误

时间:2014-05-20 16:25:05

标签: javascript node.js

我们的应用程序中的模型层将生成一个错误数组,可能包含也可能不包含对象。例如,假设有人想将thing发布到我们的api并且用户提交了无效的有效负载,示例验证错误数组可能如下所示:

["foo is required", 
 "bar must be a string", 
 { orders: ["id is required", "name must be a string"]}]

注意orders是一个对象 - 因为订单是一个具有自己属性的对象,应该在有效负载中发布,我们想要命名该对象下的任何验证错误以使其成为对象最终用户更清楚。

在我们的框架在返回400 Bad Request之前调用new Error(validationErrors)之前,一切都很好并且花花公子。

这是错误消息最终结果如下:

{"statusCode": 400,
 "error":"Bad Request",
 "message":"foo is required,bar must be a string, [object Object]"}

您可以看到嵌套订单验证对象已丢失。

作为一个短期修复,我{q} JSON.stringified validationErrors数组,但最终会导致错误:

{"statusCode":400,
 "error":"Bad Request",
 "message":"[\"the value of active is not allowed to be undefined\",\"the value of name is not allowed to be undefined\",\"the value of team is not allowed to be undefined\",\"the value of startDate is not allowed to be undefined\",\"the value of endDate is not allowed to be undefined\",{\"location\":[\"the value of name is not allowed to be undefined\",\"the value of latitude is not allowed to be undefined\",\"the value of longitude is not allowed to be undefined\"]}]"}

这个问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

鉴于输入:

var errors = [
 "foo is required", 
 "bar must be a string", 
 { orders: ["id is required", "name must be a string"]}
];

您可以将其转换为此输出:

[
 "foo is required",
 "bar must be a string", 
 "orders: id is required",
 "orders: name must be a string"
]

由于你没有提供预期的输出,我只是把它做了。


代码:

errs.reduce(function(output, current){
  if (typeof current == 'object') {
    var key = Object.keys(current)[0];
    output = output.concat(current[key].map(function(err) {
      return key + ': ' + err;
    }));
  }
  else {
    output.push(current);
  }
  return output;
}, []);

说明:

arr.reduce有两个参数:为数组中的每个元素调用的函数,以及收集第一个函数输出的初始值。

arr.map采用一个参数:一个转换上下文数组的每个元素的函数。

所以我们从errs.reduce开始,初始值为[]。我们将查看输入数组中的每个错误。如果是字符串,我们将其推送到输出数组。如果它是一个对象,那么我们通过跟踪{orders: ['error one', 'error two']}(Object.keys()[0])并使用map进行转换来将['orders: error one', 'orders: error two']转换为key