在节点中记录编程错误的简单方法是什么?

What's a simple way to log a programming error in node?

注意:我编辑了这个问题以更准确地显示问题,而不是删除和重写它。希望没关系。

对于以下代码:

var Q = require('q');

function first (){
  var d = Q.defer();

  setTimeout(function(){
    d.resolve([]);
  }, 1000);

  return d.promise;
}

function second(v){
  sdf;
  console.log("hi")
}

first()
.then(second);

如何判断里面有ReferenceError?是在 then 调用中添加第二个函数参数的唯一选项吗?

尽管不推荐,但我尝试使用 process.on('uncaughtException') 但无济于事。

谢谢!

我认为在 contract 对象的声明之前捕获错误可能是合适的。所以像这样:

map(locations, function(loc) {
    if(!loc.ClientId) {
        console.log("Error: loc.ClientId is undefined");
    } else {
        var contract = {
            "clientName": clients[loc.ClientId][0]
        }
        ...
    }
})

此处,当 loc.ClientId 未定义时,错误将记录到控制台。

这真的取决于你的堆栈跟踪是什么样的。例如,如果您使用的是 express 或 restify,您实际上可能需要监听 server 对象上的 uncaughtException 事件。错误通常不会丢失;将类似这样的内容放入示例 JS 文件中:

null.f();

您将看到抛出的 TypeError,正如您所期望的那样。

如果您不确定堆栈,请记录它:

console.log(new Error("this is my stack").stack);

像这样重写你的最终调用:

function errorHandler(err) {
  console.log('You had an error, ' + err);
}

first
  .then(second, errorHandler);

promise 捕获其中抛出的任何异常,您需要显式处理它。

特定于 q 的变体是:

first
  .then(second)
  .fail(errorHandler);

您可能认为这更容易阅读。