我在这里遇到一个奇怪的问题。简单的代码:
router.post("/resetpassword/:email", async (req, res) => {
try {
var auth = firebase.auth();
await auth.sendPasswordResetEmail(req.params.email);
res.sendStatus(200);
} catch (e) {
console.log(e);
res.sendStatus(400);
}
});
如果
,此代码可以正常工作但是如果电子邮件格式错误,我也会收到状态代码的异常,但是在调用了catch块之后我的Express应用程序崩溃了。 HTTP 400被发送到客户端,但在那之后,我的应用程序已经死了。
这是控制台输出。第一个块,如果是未知的电子邮件地址,第二个块是格式错误的。
{ [Error: There is no user record corresponding to this identifier. The user may have been deleted.]
code: 'auth/user-not-found',
message: 'There is no user record corresponding to this identifier. The user may have been deleted.' }
{ [Error: The email address is badly formatted.]
code: 'auth/invalid-email',
message: 'The email address is badly formatted.' }
[...]\node_modules\firebase\auth-node.js:39
h.send=function(a){if(a)if("string"==typeof a)this.sa.send(a);else throw Error("Only string data is supported");else this.sa.send()};h.abort=function(){this.sa.abort()};h.setRequestHeader=function(){};h.He=function(){this.status=200;this.responseText=this.sa.responseText;Ic(this,4)};h.Jd=function(){this.status=500;this.responseText="";Ic(this,4)};h.Je=function(){this.Jd()};h.Ie=function(){this.status=200;Ic(this,1)};var Ic=function(a,b){a.readyState=b;if(a.onreadystatechange)a.onreadystatechange()};var Jc=function(a,b,c){this.Ue=c;this.we=a;this.kf=b;this.oc=0;this.gc=null};Jc.prototype.get=function(){var a;0<this.oc?(this.oc--,a=this.gc,this.gc=a.next,a.next=null):a=this.we();return a};Jc.prototype.put=function(a){this.kf(a);this.oc<this.Ue&&(this.oc++,a.next=this.gc,this.gc=a)};var Kc=function(a){l.setTimeout(function(){throw a;},0)},Lc,Mc=function(){var a=l.MessageChannel;"undefined"===typeof a&&"undefined"!==ty
Error: The email address is badly formatted.
[nodemon] app crashed - waiting for file changes before starting...
我目前认为这是我身边的一个愚蠢的错误(我是node / Express的新手)。知道我在这里缺少什么吗?
答案 0 :(得分:1)
我自己在与firebase.auth()
合作时遇到了这个错误,并且非常特别。我的想法是firebase.auth()
似乎使用了它自己的Promise变体,如果该承诺没有捕获到错误,它会使你的应用程序崩溃,或者甚至将错误抛出{ {1}} / .then
链接到它。
这是我做的一个小功能,它确保将被拒绝的承诺变为已解决的承诺,然后再将其变为被拒绝的承诺。这阻止了我的应用程序崩溃,但我找不到更简单的方法。
.catch
希望它也适合你,让我知道它是否可以更直观地完成:)
答案 1 :(得分:0)
运行时:
await auth.sendPasswordResetEmail(req.params.email);
在try
/ catch
块内,您可以处理两件事:
auth.sendPasswordResetEmail()
立即抛出异常auth.sendPasswordResetEmail()
拒绝退回的承诺你不能处理的是你的代码的某些其他部分发生了什么事情并抛出了一个没有被任何东西捕获的异常。
当你发布一个指向包含数千个字符的行的错误消息示例时,无法告诉你在你的情况下发生了什么,但这是一个简单的例子。
在这个例子中,您将捕获被拒绝的承诺:
let f = () => new Promise((res, rej) => {
rej(new Error('Error'));
});
(async () => {
try {
let x = await f();
console.log('Returned value:', x);
} catch (e) {
console.log('Handled error:', e.message);
}
})();
在此示例中,您将捕获抛出的异常:
let f = () => new Promise((res, rej) => {
throw new Error('Error');
});
(async () => {
try {
let x = await f();
console.log('Returned value:', x);
} catch (e) {
console.log('Handled error:', e.message);
}
})();
在此示例中,您将处理在事件循环的不同标记中发生的拒绝:
let f = () => new Promise((res, rej) => {
setImmediate(() => rej(new Error('Error')));
});
(async () => {
try {
let x = await f();
console.log('Returned value:', x);
} catch (e) {
console.log('Handled error:', e.message);
}
})();
但是在这个例子中,不会处理在事件循环的不同刻度上抛出的异常:
let f = () => new Promise((res, rej) => {
setImmediate(() => { throw new Error('Error'); });
});
(async () => {
try {
let x = await f();
console.log('Returned value:', x);
} catch (e) {
console.log('Handled error:', e.message);
}
})();
在你的情况下必须发生类似的事情。