【问题标题】:How can i pass values from google cloud function (firebase) to front end?如何将值从谷歌云函数(firebase)传递到前端?
【发布时间】: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}。

【问题讨论】:

    标签: javascript firebase vue.js google-cloud-firestore google-cloud-functions


    【解决方案1】:

    您应该了解 Promises 和 Async 函数。

    见:

    你的代码是这样使用 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)
            })
        })
    })
    

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 2022-11-12
      • 2020-02-24
      • 2023-01-30
      • 1970-01-01
      • 2018-06-14
      • 2019-06-25
      • 1970-01-01
      • 2019-01-24
      相关资源
      最近更新 更多