Javascript 在node.js中引发错误
我有一个很小的模块作为我的数据模型。它位于路由和数据库之间,用于特定数据(在我的例子中是用户数据) 我在路由代码中需要这个模块,调用它拥有的Javascript 在node.js中引发错误,javascript,node.js,error-handling,Javascript,Node.js,Error Handling,我有一个很小的模块作为我的数据模型。它位于路由和数据库之间,用于特定数据(在我的例子中是用户数据) 我在路由代码中需要这个模块,调用它拥有的subscribe方法,通过在我的数据库中存储所需的数据,向用户订阅特定的邮件列表。耶 我的“订阅”方法接受电子邮件和电子邮件列表ID作为两个参数。合理的做法是,我将编写草率而快速的代码,并为不存在的列表输入一个id。拼写错误,你说吧 我如何抛出一个错误并指向id不正确的行号 来自model/user.js内部的代码: if (emailLists.inde
subscribe
方法,通过在我的数据库中存储所需的数据,向用户订阅特定的邮件列表。耶
我的“订阅”方法接受电子邮件和电子邮件列表ID作为两个参数。合理的做法是,我将编写草率而快速的代码,并为不存在的列表输入一个id。拼写错误,你说吧
我如何抛出一个错误并指向id不正确的行号
来自model/user.js内部的代码:
if (emailLists.indexOf(listId) === -1) {
throw new Error('listId does not exist');
}
来自route.js内部的代码:
user.subscribe('fake@email.com', 'knewsletterr', function (error, success) {
if (error) { return sendResponse(500, 'Ahhhhhhh!'); }
if (!error) { return sendResponse(200, 'subscribed'); }
});
现在,我得到:
/home/.../project/models/user.js:85
if (emailLists.indexOf(listId) === -1) { throw new Error('listId does not exist'); }
^
Error: listId does not exist
我会帮助你的
var el=document.getElementById('el');
变量日志=函数(val){
el.innerHTML+=''+val+'';
};
试一试{
抛出错误(“代码错误”);
}捕获(e){
日志(e.message);
日志(例如文件名);
日志(如行号);
日志(如堆栈);
};代码>
如果您使用的是节点样式的回调,则不是到抛出。而是将错误作为第一个参数传递给回调函数-
//用回调除法
功能分区(x,y,完成){
如果(y==0)
返回完成(错误('不能被零除'))
其他的
返回完成(空,x/y)
}
div(6,3,函数(错误,结果){
//*始终*检查错误
如果(错误)
console.log('error',err.message,err.stack)
其他的
console.log('result',result)
})
listId变量未在源代码中定义哈哈,我知道。我是那个犯错误的人。我只想知道如何抛出适当的行号和文件名以及错误。var e=newerror(“asdf”);log(e.stack)谢谢,我读了MDN页面。我想我遇到的问题是node.js堆栈跟踪。我承认,我在这一点上有点困惑。所以:谢谢,这很有帮助!这是我采取的第一种方法,但我会根据订阅某人时发生的情况做三件不同的事情(“已订阅”、“成功”、“其他错误”),所以从概念上区分事情很难。也许我应该像对待应用程序不会运行错误一样对待错误,并按照规则处理其他所有操作的结果。一般来说,throw
是一种处理错误的同步方法。在使用回调时,假设您处理的是异步代码,throw
不会特别有用。其思想是,您不必在链中的每个回调中捕获err
。如果你不想处理中间的错误,你可以把它传递到<代码>完成(Err,x);如果err
为null
,则不会发生任何事情,但是如果err
为错误
,则上述函数有机会捕捉到它。尽管如此,这并不意味着这是设计异步错误处理的最佳方法。它恰好是node中的约定,因此,如果您正在编写其他人最终会使用的应用程序/库,它可能是最佳选择。如果您只是为自己编写应用程序,那么您可以按照您认为最适合自己的方式设计错误处理,并在与其他lib交互时使用节点约定,而不是console.log('error:',err.message,err.stack)也不建议简单地抛出err
?@JoãoPimentelFerreira惯例是不抛出
,因为你不能异步地捕获
。较新的机制,如Promise和async
/wait
允许使用throw
,但不允许使用节点样式的回调。