代码之家  ›  专栏  ›  技术社区  ›  the newbie coder

Node.js-Firebase云函数批写入不工作

  •  2
  • the newbie coder  · 技术社区  · 6 年前

    我正在尝试从fixer.io(JSON格式)获取货币汇率,并使用firebase云函数将其存储到firestore中。如果我没有提交批处理,代码工作得很好,它可以将结果显示到控制台中。但是当我提交批处理时,我的firestore中没有创建任何内容,控制台中也没有显示错误日志,除了通常执行的函数,状态为“ok”

    下面是我的云函数的代码。我在请求方法中也包含了一个API键,可以随意使用,因为我只将其用于测试目的

    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    admin.initializeApp(functions.config().firebase);
    
    const firestore = functions.firestore;
    const db = admin.firestore();
    
    const FieldValue = require('firebase-admin').firestore.FieldValue;
    
    const request = require('request');
    
    exports.testCurrency = firestore
            .document('trigger/{docId}')
            .onUpdate((change, context) => {
                return request('http://data.fixer.io/api/latest?access_key=aeb14ea1a7db3bbf08edc96a41bd4be1', (error, response, body) => {
                    if(error){
                        return console.log('error:', error);
                    }
    
                    body = JSON.parse(body);
                    console.log('response: ', response.statusCode);
    
                    var batch = db.batch();
    
                    Object.keys(body["rates"]).forEach((key, index) => {
                                    console.log(key,body["rates"][key]);
                                    // key: the name of the object key
                                    // index: index of key
                                    var batchRef = db.collection('currencyRates').doc(key);
                                    batch.set(batchRef, {
                                        base: body.base,
                                        code: key,
                                        value: body["rates"][key],
                                        dateCreated: FieldValue.serverTimestamp() 
                                    });
                                });
    
                    return batch.commit().then( () => {
                                return console.log("im done");
                            }).catch((err) => {
                                return console.log('Error batch: ', err);
                            });
                });
        });
    

    这是JSON格式的结果。如果有必要的话,rates数组的大小大约是168。

    {
        success: true,
        timestamp: 1539162846,
        base: "EUR",
        date: "2018-10-10",
        rates: {
            AED: 4.21958,
            AFN: 86.890666,
            ALL: 125.212079,
            AMD: 555.643524,
            ANG: 2.029407,
            AOA: 348.895181,
            ARS: 42.90457,
            AUD: 1.619478,
            AWG: 2.068292,
            AZN: 1.955714,
            BAM: 1.953077,
            BBD: 2.288159,
            BDT: 96.49329,
            BGN: 1.955774,
            BHD: 0.433066,
            BIF: 2030.211654,
            BMD: 1.148732,
            BND: 1.619944,
            BOB: 7.900117,
            BRL: 4.269034,
            BSD: 1.143126,
            BTC: 0.000176,
            BTN: 85.26911,
            BWP: 12.46839,
            BYN: 2.462135,
            BYR: 22515.148904,
            BZD: 2.297751,
            CAD: 1.489098,
            CDF: 1866.689969,
            CHF: 1.14073,
            CLF: 0.025961,
            CLP: 781.999328,
            CNY: 7.951635,
            COP: 3515.235059,
            CRC: 671.686818,
            CUC: 1.148732,
            CUP: 30.4414,
            CVE: 110.879642,
            CZK: 25.839465,
            DJF: 204.152281,
            DKK: 7.46024,
            DOP: 57.019033,
            DZD: 136.351778,
            EGP: 20.59275,
            ERN: 17.230769,
            ETB: 31.762606,
            EUR: 1,
            FJD: 2.46248,
            FKP: 0.873014,
            GBP: 0.873927,
            GEL: 3.0154,
            GGP: 0.873866,
            GHS: 5.645042,
            GIP: 0.873123,
            GMD: 56.879486,
            GNF: 10343.241533,
            GTQ: 8.809053,
            GYD: 236.724948,
            HKD: 9.002495,
            HNL: 27.485141,
            HRK: 7.421727,
            HTG: 80.234922,
            HUF: 324.873057,
            IDR: 17489.331151,
            ILS: 4.163562,
            IMP: 0.873866,
            INR: 85.253156,
            IQD: 1364.17679,
            IRR: 48367.364525,
            ISK: 132.609588,
            JEP: 0.873866,
            JMD: 152.476977,
            JOD: 0.815388,
            JPY: 130.030675,
            KES: 116.079279,
            KGS: 79.626322,
            KHR: 4654.771655,
            KMF: 492.432692,
            KPW: 1033.875108,
            KRW: 1306.533994,
            KWD: 0.348762,
            KYD: 0.952753,
            KZT: 425.277826,
            LAK: 9754.698885,
            LBP: 1735.676925,
            LKR: 196.53612,
            LRD: 180.064096,
            LSL: 16.892084,
            LTL: 3.391907,
            LVL: 0.694857,
            LYD: 1.586976,
            MAD: 10.897331,
            MDL: 19.430783,
            MGA: 4015.335983,
            MKD: 61.577767,
            MMK: 1791.849588,
            MNT: 2946.506569,
            MOP: 9.22564,
            MRO: 410.097772,
            MUR: 39.701904,
            MVR: 17.702453,
            MWK: 835.353456,
            MXN: 21.915972,
            MYR: 4.77302,
            MZN: 69.463749,
            NAD: 16.909355,
            NGN: 416.162676,
            NIO: 36.701418,
            NOK: 9.464513,
            NPR: 136.021946,
            NZD: 1.778777,
            OMR: 0.442245,
            PAB: 1.143293,
            PEN: 3.82126,
            PGK: 3.839121,
            PHP: 62.253815,
            PKR: 147.026549,
            PLN: 4.307079,
            PYG: 6749.384482,
            QAR: 4.182653,
            RON: 4.663511,
            RSD: 118.365442,
            RUB: 76.049784,
            RWF: 1012.733695,
            SAR: 4.307918,
            SBD: 9.226628,
            SCR: 15.645159,
            SDG: 20.655924,
            SEK: 10.446081,
            SGD: 1.588583,
            SHP: 1.517356,
            SLL: 9591.913264,
            SOS: 667.413258,
            SRD: 8.567209,
            STD: 24504.701795,
            SVC: 10.00385,
            SYP: 591.597066,
            SZL: 17.114991,
            THB: 37.862491,
            TJS: 10.775738,
            TMT: 4.020562,
            TND: 3.260443,
            TOP: 2.638176,
            TRY: 7.025433,
            TTD: 7.705815,
            TWD: 35.617013,
            TZS: 2626.001928,
            UAH: 32.080682,
            UGX: 4336.463361,
            USD: 1.148732,
            UYU: 37.80484,
            UZS: 9353.378599,
            VEF: 285482.841016,
            VND: 26824.042963,
            VUV: 131.850501,
            WST: 3.039038,
            XAF: 655.064673,
            XAG: 0.080115,
            XAU: 0.000968,
            XCD: 3.104506,
            XDR: 0.825483,
            XOF: 654.949648,
            XPF: 119.089105,
            YER: 287.142825,
            ZAR: 16.841745,
            ZMK: 10339.970197,
            ZMW: 14.261535,
            ZWL: 370.299545
        }
    }
    

    1 回复  |  直到 6 年前
        1
  •  6
  •   Renaud Tarnec    5 年前

    你的问题来自于一个有请求的电话 不还债 ,而在后台事件(如 .onUpdate() 为Firestore)你 必须 回报承诺。有关更多详细信息,请观看此官方视频系列: https://firebase.google.com/docs/functions/video-series/

    所以您需要为请求使用一个接口包装器,比如 request-promise .

    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    admin.initializeApp(functions.config().firebase);
    
    const firestore = functions.firestore;
    const db = admin.firestore();
    
    const FieldValue = require('firebase-admin').firestore.FieldValue;
    
    const request = require('request');
    const rp = require('request-promise');
    
    exports.testCurrency = firestore
            .document('trigger/{docId}')
            .onUpdate((change, context) => {
    
                var options = {
                    url: 'http://data.fixer.io/api/latest?access_key=aeb14ea1a7db3bbf08edc96a41bd4be1',
                    method: 'GET'
                };
    
                return rp(options)
                .then(body => {
    
                    body = JSON.parse(body);
    
                    var batch = db.batch();
    
                    Object.keys(body["rates"]).forEach((key, index) => {
                                console.log(key,body["rates"][key]);
                                // key: the name of the object key
                                // index: index of key
                                var batchRef = db.collection('currencyRates').doc(key);
                                batch.set(batchRef, {
                                    base: body.base,
                                    code: key,
                                    value: body["rates"][key],
                                    dateCreated: FieldValue.serverTimestamp() 
                                });
                            });
    
                    return batch.commit();
    
            });
    
        });