【问题标题】:Data returned null after calling function调用函数后数据返回null
【发布时间】:2021-06-27 20:21:37
【问题描述】:

我想做什么:

我正在支付网关的服务器中下订单(使用 firebase 功能)。

placeorder() 创建命令(这部分有效)

我想要返回已下订单数据的详细信息,function(err,data) 有该数据。 但每次它返回null。

我尝试了什么:

非常确信这是基于asynchronous execution 的问题,尝试纠正它并且此代码是它的结果,仍然返回数据为NULL

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

 
/* eslint-disable */

exports.order = functions.https.onCall( (amnt, context) => {
    
    var orderdata;
    const Ippopay = require('node-ippopay');
    var ippopay_instance = new Ippopay({
        public_key: 'pk_live_0WZhCNC5l7PJ',
        secret_key: 'my secret key',
      });
      
       async function placeorder(){
        ippopay_instance.createOrder({
            amount: amnt,
            currency: 'INR',
            payment_modes: "cc,dc,nb,upi",
            customer: {
                name: "Test",
                email: "test@gmail.com",
                phone: {
                    country_code: "91",
                    national_number: "9876543210"
                }
            }
        },
  
            function (err, data) {
  
                if (err) {
                    console.log(err);
                    return;
                }
                orderdata= JSON.parse(data);
  
          }) ;
      }  
        async function orderdatareturn() {
            console.log('before promise call')
                  // Await for the placeorderdata() to complete
            let result =await placeorder();
            return result; 
        }; 
        return orderdatareturn();
}); 

【问题讨论】:

    标签: javascript node.js firebase google-cloud-functions node-modules


    【解决方案1】:

    我要做的第一件事是“承诺” ippopay api 的回调样式入口点...

    const Ippopay = require('node-ippopay');
    const ippopay_instance = new Ippopay({
      public_key: 'public key',
      secret_key: 'secret key',
    });
    
    
    // call ippopay api to createOrder and resolve with the JSON result parsed
    async function placeorder(params) {
      return new Promise((resolve, reject) => {
        ippopay_instance.createOrder(params, (error, data) => {
          if (error) reject(error);
          else resolve(JSON.parse(data));
        })
      });
    }
    

    现在导出的函数可以变得简单明了。关键是在返回之前等待承诺解决......

    exports.order = functions.https.onCall((amnt, context) => {
      const params = { amount: amnt, etc...}
      return await placeorder(params);
    })
    

    【讨论】:

    • 谢谢,检查和更新...是的,应该隐藏秘密密钥...感觉很愚蠢:)。
    • :-) 我以前做过。最好的做法是查看供应商是否允许您重新生成密钥。
    • 哈哈,像我这样的人很幸运,他们允许这样做。
    • 承诺你可以使用util.promisify from util package
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多