【发布时间】:2020-12-16 21:28:38
【问题描述】:
我的情况是,我必须使用 catch 块来执行一些代码,但我不想将其视为错误。 基本上,我想分别根据用户是否已经注册来更新/创建用户。 admin sdk 让我创建一个用户,如果用户已经存在,它会抛出一个错误。因此,如果我在 catch 块中,我知道用户已经存在并且我想更新它。
function addClient(client) {
return new Promise((resolve, reject) => {
admin.auth().createUser({
uid: client.id,
email: client.email,
emailVerified: true,
password: client.password,
}).then(record => {
resolve(record);
return null;
}).catch(
// the user already exist, I update it
admin.auth().updateUser(client.id, {
email: client.email
}).then(record => {
resolve(record);
return null;
}).catch(
err => {
reject(err);
}
)
);
});
}
问题是,当我使用现有用户调用该函数时,它会正确更新,但 HTTP 响应是内部服务器错误(我猜是因为它进入了 catch 块并将其视为错误)。如果我发送一个新用户也是如此:它已正确创建,但 HTTP 响应代码是 500。 有办法避免这种行为吗?
这是为每个收到的用户调用前一个的主要函数,它负责发送 HTTP 响应:
exports.addClients = functions.https.onRequest((req, res) => {
// fetch recevied list from payload
var receivedClients = req.body.clients;
var promises = [];
receivedClients.forEach(client => {
promises.push(addClient(client));
})
Promise.all(promises)
.then(() => {
res.sendStatus(200);
return null;
})
.catch(err => {
res.status(500).send(err);
});
});
我想我想要实现的是让所有的承诺都得到解决。
【问题讨论】:
-
您收到的错误信息是什么?
-
@Bergi 如果我向新用户发送错误代码是“auth/user-not-found”。如果我发送一个已经存在的用户,这是一个通用的“错误:无法处理请求”
-
第一个是有道理的——你的
addClient函数总是调用updateUser,看我的回答。
标签: javascript node.js asynchronous promise firebase-authentication