Не все пути кода возвращают значение (для вызываемой функции облака Google) - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть облачная функция, и когда я использую некоторые асинхронные функции и помещаю 'return' в каждый возможный вывод, я все равно получаю Не все пути кода возвращают значение

I 'мы пытались удалить вызовы из моей базы данных и просто получили 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) =>

Примечание Мне кажется, я обнаружил, что «развертывание firestore» работает, когдаЯ добавил «async» в сигнатуру вызываемого объекта, однако «предупреждение / ошибка» все еще сохраняется в коде Microsoft Studio (не все пути кода возвращают значение. Ts (7030))

export const getUsersInThisChatRoom = functions.https.onCall ( async (данные, контекст) =>

1 Ответ

1 голос
/ 04 апреля 2019

С помощью callables вы можете либо напрямую вернуть объект для сериализации и отправки клиенту, либо вы можете вернуть обещание, которое разрешается с объектом для отправки.Все, что вам нужно сделать, это вернуть обещание в вашем 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}};
    });

Это вернет обещание, которое разрешается либо в значение, которое вы вернули из обратного вызова then, либо catch.

Вы не обязаны использовать async / await, но если вы это сделаете, вам следует полностью заменить блоки then и catch с правильным синтаксисом async / await.Это будет выглядеть совсем по-другому.

...