我在猫鼬文档中发现我可以处理我想要的一般错误。所以你可以这样做:
Product.on('error', handleError);
但是这个handleError
方法的签名是什么?我想要这样的东西:
handleError = (err) ->
if err
console.log err
throw err
但这不起作用。
我在猫鼬文档中发现我可以处理我想要的一般错误。所以你可以这样做:
Product.on('error', handleError);
但是这个handleError
方法的签名是什么?我想要这样的东西:
handleError = (err) ->
if err
console.log err
throw err
但这不起作用。
在 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
花了 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 || '')));
};
我们还可以将上述通用代码放在一个通用文件中,并导入该文件,以便在其他控制器或任何其他文件中重用上述功能。