gpt4 book ai didi

Node.js - Firebase Cloud Functions 批量写入不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 00:27:46 26 4
gpt4 key购买 nike

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

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

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
}
}

更新:我的 firebase 帐户目前使用的是 Blaze 计划(即用即付),因为我在 SO 上发现了一篇帖子,上面说免费计划不允许第三方访问

最佳答案

您的问题来自这样一个事实,即请求调用不返回 promise ,而在 Cloud Functions 中由后台事件触发(例如 Firestore 的 .onUpdate() ) 你必须返回一个 Promise。观看此官方视频系列了解更多详情:https://firebase.google.com/docs/functions/video-series/ (特别是标题为“学习 JavaScript Promises”的 3 个视频,解释得非常好)。

所以你需要为请求使用一个接口(interface)包装器,比如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();

});

});

关于Node.js - Firebase Cloud Functions 批量写入不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52736795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com