并非所有代码路径 return 一个值(对于 google 云函数可调用)

Not all code paths return a value (for google cloud function callable)

我有一个云函数,当我使用一些异步函数并在每个可能的输出中放置一个 'return' 时,我仍然得到 并非所有代码路径 return 一个值

我试过删除我的数据库调用,只使用 'return {data:{...}};' 来消除错误。

我也尝试过将所有内容包装在 'try' 'catch' 块中。

我目前有两个块 get().then()...catch()..

export const getUsersInHere = functions.https.onCall((data, context) => 
{
    if(!context || !context.auth || !context.auth.uid)
    {
        return {data:{message:"Please login again...", success:false}};
    }
    else if(data)
    {
        const my_uid = context.auth.uid;
        db.collection(`InHere/${my_uid}`).get().then(snapshot => 
        {
           return {data:{}, success:true};
        }).catch(e =>
        {
            return {data:{message:"No last message yet...", success:false}};
        });
    }
    else 
    {
        return {data:{message:"no body sent", success:false}};
    }
});

我希望能够使用 firebase deploy 部署我的云功能,但我却收到部署错误:


src/index.ts:83:62 - error TS7030: Not all code paths return a value.

83 export const getUsersInHere = functions.https.onCall((data, context) =>

备注 我想我发现当我将 'async' 添加到可调用函数的签名中时 'firestore deploy' 有效,但是 'warning/error' 仍然保留在 Microsoft Studio Code 中(并非所有代码路径 return一个value.ts(7030))

export const getUsersInThisChatRoom = functions.https.onCall(async (数据, 上下文) =>

使用可调用对象,您可以直接 return 要序列化并发送给客户端的对象,或者您可以 return 与要发送的对象一起解析的承诺。您所要做的就是 return 您 else if 区块中的承诺:

    // note the return added to the next line
    return db.collection(`InHere/${my_uid}`).get().then(snapshot => 
    {
        return {data:{}, success:true};
    }).catch(e =>
    {
        return {data:{message:"No last message yet...", success:false}};
    });

这将 return 承诺解析为您从 thencatch 回调中 return 得到的值。

您没有义务使用 async/await,但如果您这样做,您应该使用正确的 async/await 语法完全替换您的 then 和 catch 块。看起来会很不一样。