提问者:小点点

将类部署为Firebase云函数的正确方法是什么?


我想公开一个类作为Firebase云函数。 下面是我的index.js:

"use strict";

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

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
//  response.send("Hello from Firebase!");
// });

var crypto = require('crypto');

class PaytmChecksum {

    static encrypt(input, key) {
        var cipher = crypto.createCipheriv('AES-128-CBC', key, PaytmChecksum.iv);
        var encrypted = cipher.update(input, 'binary', 'base64');
        encrypted += cipher.final('base64');
        return encrypted;
    }
    static decrypt(encrypted, key) {
        var decipher = crypto.createDecipheriv('AES-128-CBC', key, PaytmChecksum.iv);
        var decrypted = decipher.update(encrypted, 'base64', 'binary');
        try {
            decrypted += decipher.final('binary');
        }
        catch (e) {
            console.log(e);
        }
        return decrypted;
    }
    static generateSignature(params, key) {
        if (typeof params !== "object" && typeof params !== "string") {
            var error = "string or object expected, " + (typeof params) + " given.";
            return Promise.reject(error);
        }
        if (typeof params !== "string"){
            params = PaytmChecksum.getStringByParams(params);
        }
        return PaytmChecksum.generateSignatureByString(params, key);
    }


    static verifySignature(params, key, checksum) {
        if (typeof params !== "object" && typeof params !== "string") {
            var error = "string or object expected, " + (typeof params) + " given.";
            return Promise.reject(error);
        }
        if(params.hasOwnProperty("CHECKSUMHASH")){
            delete params.CHECKSUMHASH
        }
        if (typeof params !== "string"){
            params = PaytmChecksum.getStringByParams(params);
        }
        return PaytmChecksum.verifySignatureByString(params, key, checksum);
    }

    static async generateSignatureByString(params, key) {
        var salt = await PaytmChecksum.generateRandomString(4);
        return PaytmChecksum.calculateChecksum(params, key, salt);
    }

    static verifySignatureByString(params, key, checksum) {
        var paytm_hash = PaytmChecksum.decrypt(checksum, key);
        var salt = paytm_hash.substr(paytm_hash.length - 4);
        return (paytm_hash === PaytmChecksum.calculateHash(params, salt));
    }

    static generateRandomString(length) {
        return new Promise((resolve, reject) => {
            crypto.randomBytes((length * 3.0) / 4.0, (err, buf) => {
                if (!err) {
                    var salt = buf.toString("base64");
                    resolve(salt);
                }
                else {
                    console.log("error occurred in generateRandomString: " + err);
                    reject(err);
                }
            });
        });
    }

    static getStringByParams(params) {
        var data = {};
        Object.keys(params).sort().forEach((key,value) => {
            data[key] = (params[key] !== null && params[key].toLowerCase() !== "null") ? params[key] : "";
        });
        return Object.values(data).join('|');
    }

    static calculateHash(params, salt) {
        var finalString = params + "|" + salt;
        return crypto.createHash('sha256').update(finalString).digest('hex') + salt;
    }
    static calculateChecksum(params, key, salt) {
        var hashString = PaytmChecksum.calculateHash(params, salt);
        return PaytmChecksum.encrypt(hashString,key);
    }
}
PaytmChecksum.iv = '@@@@&&&&####$$$$';
modules.exports = PaytmChecksum;

当我部署这个函数时,它显示部署成功,但我在Firebase控制台中没有看到这个函数。 下面是deploy命令的输出:

sr@SR:~/AndroidStudioProjects/BuddayWale/functions$ sudo firebase deploy --only functions

=== Deploying to 'buddaywale-b1923'...

i  deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint /home/sr/AndroidStudioProjects/BuddayWale/functions
> eslint .

✔  functions: Finished running predeploy script.
i  functions: ensuring required API cloudfunctions.googleapis.com is enabled...

⚠  functions: The Node.js 8 runtime is deprecated and will be decommissioned on 2021-03-15. For more information, see: https://firebase.google.com/support/faq#functions-runtime

✔  functions: required API cloudfunctions.googleapis.com is enabled
i  functions: preparing functions directory for uploading...

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/buddaywale-b1923/overview

我错过了什么? 我做错了什么? 部署云功能的正确方式是什么?


共1个答案

匿名用户

虽然您可以使用云函数代码中的类,但为了让Firebase能够连接您的函数,它们必须声明为Functions.,然后声明为type of Trigger。

乍一看,我在您共享的代码中没有看到任何云函数声明(exports.helloworld=Functions...=>{,所以这可以解释为什么您在云函数控制台中没有看到任何此代码。

在云函数中使用类的一种简单方法是:

exports.helloWorld = functions.https.onRequest((request, response) => {
  let paymentChecksum = new PaytmChecksum();
  let result = paymentChecksum.encrypt("...", "...")
  response.send(result);
});

有关这方面的更多信息,包括触发代码的各种方式,请参阅代码中的文档链接:https://firebase.google.com/docs/functions/write-firebase-functions