Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js:抛出错误及其';他没有被抓住_Javascript_Node.js_Mongodb_Swagger - Fatal编程技术网

Javascript node.js:抛出错误及其';他没有被抓住

Javascript node.js:抛出错误及其';他没有被抓住,javascript,node.js,mongodb,swagger,Javascript,Node.js,Mongodb,Swagger,我有一个使用swagger的API,它与node.js上的express集成,还有一个定义如下的资源。在检查(!req.params.id)时抛出的swagger错误被swagger的默认错误处理程序捕获。mongoDB delete调用的回调中抛出的错误未被捕获,这给了我下面的错误。这个错误似乎与回调函数的作用域/顺序有关,作为node.js的新手,我希望得到如何正确执行此操作的建议,保持异步性-谢谢 events.js:74 抛出类型错误('未捕获,未指定的“错误”事件'); ^TypeEr

我有一个使用swagger的API,它与node.js上的express集成,还有一个定义如下的资源。在检查(!req.params.id)时抛出的swagger错误被swagger的默认错误处理程序捕获。mongoDB delete调用的回调中抛出的错误未被捕获,这给了我下面的错误。这个错误似乎与回调函数的作用域/顺序有关,作为node.js的新手,我希望得到如何正确执行此操作的建议,保持异步性-谢谢

events.js:74 抛出类型错误('未捕获,未指定的“错误”事件'); ^TypeError:未捕获的未指定“错误”事件


异步回调中引发的异常将转到回调的调用方,而不是您周围的代码。因此,是
req.coll.remove
代码接收异常(未处理异常)并导致应用程序崩溃

相反,您需要让remove
action
函数接受一个回调参数,该参数可用于将错误反馈给调用者


这就是为什么node.js代码中很少使用异常,回调是标准的。

规则1。不要插嘴。最好不要扔。仅当希望进程崩溃时抛出。如果需要将错误传递给调用者,请使用
回调(err)
。如果您在connect/express中间件范围内,还可以使用
next(err)


规则2。如果仍有东西被抛出,而您想抓住它,请使用。考虑到规则1,这样你只能捕捉到超级意外的事情,所以你必须尽快完成这个过程

不要使用回调,而是使用承诺并在承诺链中抛出excaption

var P = require('bluebird');

// ...

return new P(function(resolve, reject) {
  req.coll.remove({_id : req.coll.id(req.params.id)}, function(e, result) {
    if (e) {
      reject(swe.invalid('collection'));   // THIS ERROR will be CAUGHT
    }
    resolve(res.send({msg : 'success'}));
  });
})
.catch(function(err) {
  throw err;
});

您所说的“未捕获”是什么意思?它不是被某个自定义错误处理程序捕获的,还是没有在控制台中抛出错误?从异步处理程序抛出的异常不容易被捕获。修复导致抛出异常的问题怎么样?JohnnyHK的答案也是正确的,但是vkurchatkin也指出了我将要研究的领域。
var P = require('bluebird');

// ...

return new P(function(resolve, reject) {
  req.coll.remove({_id : req.coll.id(req.params.id)}, function(e, result) {
    if (e) {
      reject(swe.invalid('collection'));   // THIS ERROR will be CAUGHT
    }
    resolve(res.send({msg : 'success'}));
  });
})
.catch(function(err) {
  throw err;
});