设置firebase云函数调用

设置firebase云函数调用,firebase,google-cloud-firestore,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Functions,我正在尝试用firebase设置云函数,但设置起来有点困难。 我想设置一个由HTTP请求调用的函数。函数将获取提供的信息,仔细检查这些值是否确实与我的firestorm中找到的值相同 然后在响应之前执行一些Javascript代码;这是我的代码: // The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers. const functions = require("firebase

我正在尝试用firebase设置云函数,但设置起来有点困难。 我想设置一个由HTTP请求调用的函数。函数将获取提供的信息,仔细检查这些值是否确实与我的firestorm中找到的值相同 然后在响应之前执行一些Javascript代码;这是我的代码:

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require("firebase-functions");
// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();


// [START trigger]
exports.buyCrypto = functions.https.onRequest((request, res) => 
{
  // [END trigger]
  // [START sendError]
  // Forbidding PUT requests.
  if (request.method === 'PUT') {
    return res.status(403).send('Forbidden!');
  }
  // [END sendError]
  
    // [START readQueryParam]
    const uid = request.body.uid
    const crypto = request.body.crypto
    const amount = request.body.amount
    
    const docRef = admin.firestore().collection("users").doc(uid);
    docRef.get().then((doc) => {
        if (doc.exists) {
            if(crypto === "BTC")
            {
                if(doc.data.btc <= amount)
                {
                    //execute buy
                    return res.status(200).send("Sucess");
                }
            }
            if(crypto === "ETH")
            {
                if(doc.data.btc <= amount)
                {
                    //execute buy
                    return res.status(200).send("Sucess");
                }
            }
        } else {
            // doc.data() will be undefined in this case
            console.log("No such document!");
        }
    }).catch((error) => {
        console.log("Error getting document:", error);
    });
    
    // Push the new message into Firestore using the Firebase Admin SDK.
    //const writeResult = await admin.firestore().collection('messages').add({original: original});
    // Send back a message that we've successfully written the message
    
    // [START sendResponse]
    const formattedResponse =  "IDK"
    return res.status(403).send("Failed");
    // [END sendResponse]
});
//Firebase SDK的云函数用于创建云函数和设置触发器。
常量函数=需要(“firebase函数”);
//访问Firestore的Firebase管理SDK。
const admin=require('firebase-admin');
admin.initializeApp();
//[启动触发器]
exports.buyCrypto=functions.https.onRequest((请求,res)=>
{
//[结束触发器]
//[启动发送错误]
//禁止PUT请求。
if(request.method=='PUT'){
返回res.status(403.send)('禁止!');
}
//[结束发送错误]
//[启动readQueryParam]
const uid=request.body.uid
const crypto=request.body.crypto
常量金额=request.body.amount
const docRef=admin.firestore().collection(“用户”).doc(uid);
docRef.get()。然后((doc)=>{
如果(文件存在){
如果(加密==“BTC”)
{

如果(doc.data.btc您正在调用
返回res.status(403).send(“失败”);
then()块之外,那么将在异步调用
get()之前调用此行
方法已完成,并且此方法返回的承诺已实现。结果:您的云函数总是向其调用者发回错误

此外,您可以使用
doc.data.btc
而不是
doc.data().btc
。请参阅文档了解,
data()
是一种方法

另外,请注意,您不需要在HTTPS云函数中使用
return
。只需使用
res.redirect()
res.send()
、或
res.end()
返回响应即可。您可以观看此视频:

因此,以下几点可以起到作用:

exports.buyCrypto = functions.https.onRequest((request, res) => {
    if (request.method === 'PUT') {
        return res.status(403).send('Forbidden!');
    }
    const uid = request.body.uid
    const crypto = request.body.crypto
    const amount = request.body.amount

    const docRef = admin.firestore().collection("users").doc(uid);
    docRef.get().then((doc) => {
        if (doc.exists) {
            if (crypto === "BTC") {
                if (doc.data().btc <= amount) {
                    //execute buy
                    res.status(200).send("Success");
                } else {
                    // send a 200 response or throw an error  res.status(200).send("....");
                    // Depends on your functional requirements
                }
            } else if (crypto === "ETH") {
                if (doc.data.btc <= amount) {
                    //execute buy
                    return res.status(200).send("Success");
                } else {
                    // send a 200 response or throw an error  res.status(200).send("....");
                    // Depends on your functional requirements
                }
            } else {
                // send a 200 response or throw an error  res.status(200).send("....");
                // Depends on your functional requirements
            }
        } else {
            console.log("No such document!");
            // send a 200 response or throw an error  res.status(200).send("....");
        }
    }).catch((error) => {
        console.log("Error getting document:", error);
        res.status(500).send(error);
    });

});
exports.buyCrypto=functions.https.onRequest((请求,res)=>{
if(request.method=='PUT'){
返回res.status(403.send)('禁止!');
}
const uid=request.body.uid
const crypto=request.body.crypto
常量金额=request.body.amount
const docRef=admin.firestore().collection(“用户”).doc(uid);
docRef.get()。然后((doc)=>{
如果(文件存在){
如果(加密==“BTC”){

如果(doc.data().btc)感谢您的评论,我观看了视频,现在HTTPS函数的工作方式更加合理。我只有一个问题,我尝试了这种方法,也尝试了视频“const promise=admin.firestore().doc(dataPath.get();”中的方法使用datapath='users/'+uid,但不幸的是,它找不到我需要的文档。我仔细检查了我的firestore,我有一个用户集合,在uid后面有文档名,但它找不到任何内容。是否需要对admin.firestore对象进行一些配置?您的代码应该没有任何问题。您的操作正确吗
const admin=require('firebase-admin');admin.initializeApp();
并且您的查询语法正确。您确定
uid
具有正确的值吗?如果执行
console.log(uid),您会看到什么
?这是所有信息的屏幕截图。在左边,我有我的fire store数据以及用户集合和文档。在左边,我有执行的nodeJS终端。我写了一些发送到函数的信息的控制台日志,我把它从请求体中拉出来并打印出来,似乎所有的信息都是如果部署函数并在没有模拟器的情况下运行它(调用Firebase/GCP平台上托管的“真实”端点),会发生什么。事实上,这是一个很好的观点,我以前从未尝试过。我仍然使用免费计划,因此在升级到现收现付模式之前,我无法部署到真正的端点。到目前为止,我只使用可能不会公开的应用程序测试云功能。模拟器和真正的端点之间会有区别吗?