Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从Google Firebase函数中的失败承诺返回自定义错误消息?_Javascript_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript 如何从Google Firebase函数中的失败承诺返回自定义错误消息?

Javascript 如何从Google Firebase函数中的失败承诺返回自定义错误消息?,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我制作了一个Firebase云函数来创建一个新用户(我制作的是一个自定义函数,而不是使用Firebase.auth().createUserWithEmailAndPassword,因为我想在创建时为用户添加其他数据)。我希望在承诺被拒绝时显示自定义错误消息,或者至少保留原始Firebase错误消息(在电子邮件地址已被使用等情况下)。但是,现在每当承诺被拒绝时,客户端只能看到500内部服务器错误,这对最终用户没有多大帮助。我认为这是按照预期发生的 如果调用了可调用触发器,但由于未处理的 异常或返

我制作了一个Firebase云函数来创建一个新用户(我制作的是一个自定义函数,而不是使用
Firebase.auth().createUserWithEmailAndPassword
,因为我想在创建时为用户添加其他数据)。我希望在承诺被拒绝时显示自定义错误消息,或者至少保留原始Firebase错误消息(在电子邮件地址已被使用等情况下)。但是,现在每当承诺被拒绝时,客户端只能看到
500内部服务器错误
,这对最终用户没有多大帮助。我认为这是按照预期发生的

如果调用了可调用触发器,但由于未处理的 异常或返回失败的承诺,请求将被拒绝 500内部服务器错误,错误代码为内部。这 防止编码错误意外暴露给最终用户

有没有一种好方法可以在云函数中保留原始错误消息,而不使其默认为500错误?我想我可以在
catch
块中编写自己的错误处理,这将“解决”我想向用户显示的错误,但这似乎是一个混乱的解决方案……有什么想法吗?我的代码如下:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

const serviceAccount = require('./serviceAccount.json');
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);

exports.createUser = functions.https.onCall((data, context) => {
    return new Promise((resolve, reject) => {
        const { name, email, password } = data || {};
        if (!name || name.length > 50 || /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(email) === false || password.length < 8) {
            reject(new Error("Invalid data"));
        }
        else {
            resolve(admin.auth().createUser({
                email,
                password,
                displayName: name
            }));
        }
    });
});
const functions=require('firebase-functions');
const admin=require('firebase-admin');
const servicecomport=require('./servicecomport.json');
const adminConfig=JSON.parse(process.env.FIREBASE\u CONFIG);
adminConfig.credential=admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);
exports.createUser=functions.https.onCall((数据、上下文)=>{
返回新承诺((解决、拒绝)=>{
const{name,email,password}=data |{};
如果(!name | | | | name.length>50 |$/^[a-zA-Z0-9.!$%&'*+/=?^{{124;}-]+@[a-zA-Z0-9-]+(?:\[a-zA-Z0-9-]+)*$/。测试(电子邮件)==false |密码长度<8){
拒绝(新错误(“无效数据”));
}
否则{
解析(admin.auth().createUser({
电子邮件
暗语
displayName:name
}));
}
});
});
EDIT——下面的答案解决了我的问题;以下是我的更新代码,以防其他人有类似需求:

exports.createUser = functions.https.onCall((data, context) => {
    return new Promise((resolve, reject) => {
        const { name, email, password } = data || {};
        if (!name || name.length > 50 || /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(email) === false || password.length < 8) {
            reject(new functions.https.HttpsError('invalid-argument', 'Invalid data'));
        }
        else {
            admin.auth().createUser({
                email,
                password,
                displayName: name
            })
            .then( res => resolve(res))
            .catch( err => reject(new functions.https.HttpsError('failed-precondition', err.message || 'Internal Server Error')))
        }
    });
});
exports.createUser=functions.https.onCall((数据,上下文)=>{
返回新承诺((解决、拒绝)=>{
const{name,email,password}=data |{};
如果(!name | | | | name.length>50 |$/^[a-zA-Z0-9.!$%&'*+/=?^{{124;}-]+@[a-zA-Z0-9-]+(?:\[a-zA-Z0-9-]+)*$/。测试(电子邮件)==false |密码长度<8){
拒绝(newfunctions.https.HttpsError('invalid-argument','invalid data');
}
否则{
admin.auth().createUser({
电子邮件
暗语
displayName:name
})
。然后(res=>resolve(res))
.catch(err=>reject(新函数.https.HttpsError('failed-premission',err.message | | Internal Server Error'))
}
});
});
建议您抛出一个包含要发送给客户端的信息的。字符串代码将被转换为HTTP状态代码,您传递的消息也将可用