【问题标题】:Async/Await Calls within Google Firestore Cloud Functions (using Clearbit Company API)Google Firestore 云函数中的异步/等待调用(使用 Clearbit 公司 API)
【发布时间】:2020-09-30 08:49:41
【问题描述】:

我正在构建一个简单的 React 应用来存储具有 Firebase 后端和云功能的公开公司数据。我想编写一个 onCreate 云函数来从 Clearbit 的 API (https://clearbit.com/docs#api-reference) 中提取额外的公司数据。以下是 Clearbit 文档中关于如何执行此操作的摘要:

const clearbit = require('clearbit')(api-key);

clearbit.Company.find({domain: 'segment.com'}).then(function (company) {
  console.log('Name: ', company.name);
});

我想将其转换为等待/异步,并且这样做了:

const getEmployerData = (domain) => {
  async function fetch() {
    try {
      const response = await clearbit.Company.find({ domain: domain });
      console.log(response)
    } catch (err) {
      console.log("fetch failed", err);
    }
    return response;
  }
  fetch();
};

我可以确认 clearbit.Company.find() 正在工作,因为上面的 console.log 返回以下内容:

response=  Resource {
  options: {},
  id: 'f3514cf8-c3c1-4eb4-be6a-13604de59c8b',
  name: 'Segment',
  legalName: 'Segment.io Inc',
  domain: 'segment.com',
  domainAliases: [ 'segment.io' ],
  description: 'Segment is a customer data platform (CDP) that helps you collect, clean, and control your customer data.',
  ...
   } 

我在我的云函数中调用 getEmployerData,如下所示:

exports.updateEmployerData = functions.firestore
  .document("/employers/{documentId}")
  .onCreate(async (snap, context) => {
    const employerId = context.params.documentId;
    const url = snap.get("url");
    const employerDataFromClearbit = await getEmployerData(url);
    const employerRef = admin
      .firestore()
      .collection("employers")
      .doc(employerId);

    return await employerRef.update({
      description: employerDataFromClearbit.description;
    });
  });

但是,getEmployerData() 返回 undefined 并且我的更新函数失败。不知道为什么我无法在我的云功能中访问 Clearbit 返回的公司数据并感谢任何帮助。谢谢。

【问题讨论】:

    标签: javascript node.js google-cloud-firestore async-await


    【解决方案1】:

    这是一个范围问题:responsetry 内部声明,但在未定义的外部返回。而是尝试在 try 之外声明它:

    const getEmployerData = (domain) => {
      async function fetch() {
        let response; // <-- declare it here
        try {
          response = await clearbit.Company.find({ domain: domain });
          console.log(response)
        } catch (err) {
          console.log("fetch failed", err);
        }
        return response; // so that it's still in scope here
      }
      return fetch(); // per @danh's answer below!
    };
    

    有关范围的更多信息,请参阅:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/consthttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

    【讨论】:

    • 谢谢,我试过了,仍然遇到同样的错误。但是您对范围的评论让我想到我需要将 getEmployerData 拉入导出的云函数 updateEmployerData。
    • @see danh 在下面的回答 - 我认为您需要我在这里写的内容和他的回答 - 我会更新我的回答以包括他的建议。
    • 谢谢,我终于让它工作了。非常感谢您的帮助!
    【解决方案2】:

    getEmployerData 不返回任何内容。试试……

    // ...
    return fetch()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 2019-04-20
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多