5

我在猫鼬文档中发现我可以处理我想要的一般错误。所以你可以这样做:

Product.on('error', handleError);

但是这个handleError方法的签名是什么?我想要这样的东西:

handleError = (err) ->
  if err
    console.log err
    throw err

但这不起作用。

4

2 回答 2

5

在 Node 中,error事件提供一个参数是标准的,即错误本身。根据我的经验,即使是提供附加参数的少数库也总是将错误作为第一个,以便您可以使用带有签名的函数function(err)

你也可以在 GitHub 上查看源代码;这是发出事件的预保存钩子error,当出现问题时,错误作为参数:https ://github.com/LearnBoost/mongoose/blob/cd8e0ab/lib/document.js#L1140

在 JavaScript 中还有一种非常简单的方法可以查看传递给函数的所有参数:

f = ->
  console.log(arguments)

f()                     # {}
f(1, "two", {num: 3})   # { '0': 1, '1': 'two', '2': { num: 3 } }
f([1, "two", {num: 3}]) # { '0': [ 1, 'two', { num: 3 } ] }

所以现在到你的功能不起作用的部分;你的代码到底是怎么读的?这个名字handleError在任何方面都不是特别的。您将需要以下两者之一:

选项1:定义函数,并将引用传递给事件注册:

handleError = (err) ->
  console.log "Got an error", err

Product.on('error', handleError)

选项2:定义内联函数:

Product.on 'error', (err) ->
  console.log "Got an error", err
于 2012-08-22T04:56:18.417 回答
0

花了 1 小时寻找简单、常见的地方和最佳方法:

下面的代码在express.js

app.js

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {

  // set locals, only providing error in development
  if (req.app.get('env') === 'development') {
    res.locals.message = err.message;
    res.locals.error = err;
    console.error(err);
  } else {
    res.locals.message = 'Something went wrong. Please try again!';
    res.locals.error = {};
  }

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

product-controller.js

let handleSuccess = (req, res, next, msg) => {
  res.send(msg + ' success ');
};

let handleError = (req, res, next, msg, err) => {
  // Create an error and pass it to the next function
  next(new Error(msg + ' error ' + (err.message || '')));
};

我们还可以将上述通用代码放在一个通用文件中,并导入该文件,以便在其他控制器或任何其他文件中重用上述功能。

于 2020-11-12T10:59:22.153 回答