如何将值从谷歌云函数(firebase)传递到前端?

Posted

技术标签:

【中文标题】如何将值从谷歌云函数(firebase)传递到前端?【英文标题】:How can i pass values from google cloud function (firebase) to front end? 【发布时间】:2019-12-16 05:56:22 【问题描述】:

我目前正在使用 vuejs 和 firebase 构建一个应用程序,以在此应用程序中获取新用户,只有管理员权限的用户才能执行此任务。因此,在 Admin sdk 和云功能的帮助下,我设法弄清楚了如何从前端触发云功能。它自己的功能做了两件事: 1)在认证部分创建用户。 2) 在云 Firestore 数据库中添加用户 ID 为 documentid 的新用户。 (/users/$(userid))

这部分效果很好。我现在唯一缺少的是后端将最近创建的用户的用户 ID 返回到前端。

我尝试通过将 .then() 放在云函数代码中的 db.collection 之后并将 .then(result => 放在我的代码的前端中来实现它。

云功能代码

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

admin.initializeApp();

const db = admin.firestore();

exports.createNewUser = functions.https.onCall((data, context) => 
  return admin.auth().createUser(
    email: data.email,
    displayName: data.name,
    password: '123456',
    emailVerified: true,
    disabled: false
  )
  .then(() => 
    return admin.auth().getUserByEmail(data.email)
    .then(user => 
      db.collection('users').doc(user.uid).set(
        mail: user.email,
        name: user.displayName
      )
      .then(() => 
        return user.uid
      );
    );
  );
);

前端代码

methods: 
    addNewUser()
      const createNewUser = firebase.functions().httpsCallable('createNewUser');
      createNewUser(email: 'test@testing.com', name: 'testName')
      .then(result => 
        console.log(result)
      )
    
  

在控制台中我得到一个数组 data: null。

【问题讨论】:

【参考方案1】:

您应该了解 Promises 和 Async 函数。

见:

https://developers.google.com/web/fundamentals/primers/promises https://developer.mozilla.org/ja/docs/Web/javascript/Reference/Global_Objects/Promise https://developers.google.com/web/fundamentals/primers/async-functions https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function

你的代码是这样使用 async/await 的。

试试下面的代码。

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

admin.initializeApp();

const db = admin.firestore();

exports.createNewUser = functions.https.onCall(async (data, context) => 
  const user = await admin.auth().createUser(
    email: data.email,
    displayName: data.name,
    password: "123456",
    emailVerified: true,
    disabled: false
  );
  await db
    .collection("users")
    .doc(user.uid)
    .set(
      mail: user.email,
      name: user.displayName
    );

  return user.uid;
);

【讨论】:

工作就像一个魅力,我绝对需要了解更多关于异步/等待功能。谢谢!【参考方案2】:

我认为你应该尝试使用 cors npm = https://www.npmjs.com/package/cors。


const cors = require('cors')(
    origin: true
)

exports.foo = functions.https.onRequest((req, res) => 
    cors(req, res, () => 
        //your process
        .then(user => 
            res.status(200).send(user.uid)
        )
        .catch(err => 
            res.status(500).send(err)
        )
    )
)

【讨论】:

以上是关于如何将值从谷歌云函数(firebase)传递到前端?的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从 javascript 函数传递到 django 视图

如何将值从模板传递到 ts 函数

如何使用 clojure.test 将值从夹具传递到测试?

如何将值从 javascript 传递到 iOS UIWebView

将值从一个函数传递到另一个C ++

如何将值从javascript传递到iOS UIWebView