Node.js Express,错误处理仅适用于console.error

时间:2016-08-22 14:33:32

标签: javascript node.js express promise

我正在使用Node.js Express来创建一些HTTP REST API。 我有方法调用下划线服务,返回 Promise ,如下所示:

function getAllApps(request, response) {
    appService.getAllApps(request.query.$expand).then(function (apps) {
           response.status(200).send(apps);
        })
}

我将方法映射如下:

var api = express.app;
api.get('/apps', getAllApps);

现在,我已经引入了错误处理如下:

function getAllApps(request, response) {
    appService.getApps(request.query.$expand).then(function (apps) {
        response.status(200).send(apps);
        })
        .catch(function (err) {
            console.error('Error occurred in Apps Api: ' + err);
            response.status(400).send(err);
    });
}

除了遇到错误时,我在控制台中获得完整的错误堆栈,如下所示:

Express is listening on 127.0.0.1:3000
Web Api ready

Error occurred in Apps Api: Error: Actions is not defined on the model.

但我的HTTP方法返回400并且正文为空,它只包含大括号:

{}

2 个答案:

答案 0 :(得分:2)

它是由错误对象没有可枚举属性引起的,因此JSON.stringify(new Error("my message"))将返回{}。要获得与控制台输出相同的结果,您必须将错误对象与字符串相关联,如下所示:

.catch(function (err) {
  console.error('Error occurred in Apps Api: ' + err);
  response.status(500).send("" + err);
});

PS:你应该使用status(500)来解决内部错误。

修改

如果这种情况不需要单独的错误处理机制,您可以让express来处理您的错误:

function getAllApps(request, response, next) {
  appService.getApps(request.query.$expand).then(function (apps) {
    response.status(200).send(apps);
  })
  .catch(function (err) {
    next(err || new Error("Unknown error"));
  });
}

如果express'默认错误处理不能给你满意的结果,你可以注册自己的错误处理程序:

...

// note that the middleware having 4 parameters makes it an error handler
app.use(function(err, req, res, next) {
  console.error('Error occurred in Apps Api: ' + err);
  response.status(500).send("" + err);
});

答案 1 :(得分:-1)

删除状态400,如下所示:

function getAllApps(request, response) {
  appService.getApps(request.query.$expand).then(function (apps) {
    response.status(200).send(apps);
    })
    .catch(function (err) {
        console.error('Error occurred in Apps Api: ' + err);
        response.json('Error occurred in Apps Api: ' + err);
  });
}