firebase setDoc函数返回什么?

gc0ot86w  于 2022-12-19  发布在  其他
关注(0)|答案(4)|浏览(318)

我在我的reactjs+typescript项目中使用firebase,我想用firebase写一个文档,我使用setDoc来完成这项工作。

import { doc, setDoc } from 'firebase/firestore';

setDoc(doc(database, `path`), objData)

当你检查函数的返回时,它说Promise<...>,但是,如果我不知道当它fullfil/reject时,我应该如何使用then()catch() promise处理程序呢?

gkn4icbw

gkn4icbw1#

我对Firebase不是很熟悉,但环顾四周后,似乎回报就是setDoc()是否成功。所以.then()意味着是,.catch()意味着否。所以实际上,您想要的就是这样的东西

import { doc, setDoc } from 'firebase/firestore';

setDoc(doc(database, `path`), objData)
.then(() => {
console.log("Successful")})
.catch((error) => {
console.log(`Unsuccessful returned error ${error}`)});

同样,我不能完全确定返回的确切值,因为我找不到太多,但如果有一个给定的结果值,您将把它放在.then((result) => {console.log(result)})中。

8ehkhllq

8ehkhllq2#

firebase文档建议使用await,所以这里有一个完整的例子,用await处理错误,用finally清 debugging 误。

import { doc, setDoc } from 'firebase/firestore';

async function run() {
    try {
        await setDoc(doc(database, `path`), objData)
    } catch (e) {
        console.error(e); // handle your error here
    } finally {
        console.log('Cleanup here'); // cleanup, always executed
    }
}

run();
mbyulnm0

mbyulnm03#

在Typescript中,你不需要精确地指定promise返回类型。下面是一个如何在setDoc中使用promise处理程序的例子:

import { doc, setDoc } from 'firebase/firestore';

setDoc(doc(database, `path`), objData)
  .then((data) => {console.log('data', data);})
  .catch((err) => {console.log('err', err);})
eivgtgni

eivgtgni4#

我发现了一些奇怪的行为。我在Angular中做了一个处理函数,它调用了一个Firebase云函数,该函数写入Firestore。我正在使用模拟器。

  • 应用程序组件. ts *
wordRequest(word: string, l2Language: L2Language, requestOrigin: string) {
    const buildWordObject = httpsCallableFromURL(this.functions, 'http://localhost:5001/my-app/us-central1/buildWordObject');
    buildWordObject({
      word: word,
      l2Language: l2Language,
      requestOrigin: requestOrigin
    })
      .then((result) => {
        console.log(result.data);
        if (result.data === null) {
          console.log("Success! Word object written to database.");
        }
      })
      .catch((error) => {
        console.error(error);
      });
  }
  • 索引. js *
export const buildWordObject = functions.https.onCall((data, context) => {
    ...does various stuff here

    setDoc(doc(firestore, 'Dictionaries/' + longLanguage + '/Words', word), wordObject)
        .then(() => {
            console.log("Finished writing word object to Firestore database: " + word);
            return 37
        })
        .catch((error: any) => {
            console.error(error);
            return error
        });
    return 38
});

这将在模拟器控制台中记录Finished writing word object to Firestore database: luck,并在Angular控制台中记录38
如果我注解掉return 38,模拟器日志是相同的,但在Angular控制台中,我看到:

Success! Word object written to database.

无论采用哪种方式,数据都将写入Firestore模拟器。
一个成功的数据库写操作返回null到调用它的Angular处理函数,我在几秒钟内没有看到Success!,所以很明显它正在异步地执行一些操作。
如果我注解掉return 37return error,那么一切都可以正常运行。通常当我编写一个没有return语句的Firebase云函数时,它会在日志中抛出一个错误。
我觉得奇怪的是,返回到Angular处理程序的总是null,而不是37console.log消息写入模拟器日志,但return 37语句从未执行。除了null,您不能返回任何东西给调用函数。
我试着把.finally(() => { return 37 });放在最后,但我再也没有得到37回来。

相关问题