【发布时间】:2018-03-31 17:31:57
【问题描述】:
我并没有完全兑现承诺。无论如何,我正在读取 mysql 表中的行列表,然后在写入 Firestore 时,我想更新“相关”记录的计数。基本上是总计数。
这里是开始:
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
var data = JSON.parse(body);
//console.log(data);
var allObjects = data.resource;
var obj = {};
for (j = 0; j < allObjects.length; j++) {
var records = [];
var record = allObjects[j];
//FireStore
var db = admin.firestore();
var docRef = db.collection(toCollection).doc(record.nfCode);
var rec = docRef.set(record);
addCounts(docRef);
}
res.render('index', {title: 'Load Table'});
offset = offset + limit
} else {
return res.send(body);//
//res.render('index', { title: 'Error' });
}
});
那么这里是addCount:
function addCounts(docRef) {
// In a transaction, update the aggregate totals
var db = admin.firestore();
return db.runTransaction(transaction => {
transaction.get(docRef).then(res => {
var brandRef = db.collection('brands').doc(res.data().brandNFCode);
var transaction = db.runTransaction(t => {
return t.get(brandRef)
.then(doc => {
if (res.data().glutenFreeYN == "Y") {
var glutenFreeCount = doc.data().glutenFreeCount + 1;
var setWithOptions = transaction.set(brand, {
glutenFreeProductCount: glutenFreeProductCount
}, { merge: true });
return setWithOptions;
}
});
})
.then(result => {
console.log('Transaction success', result);
// return nil
})
.catch(err => {
// console.log('Transaction failure:', err);
return nil
});
})
})
}
有没有更好的方法来做到这一点?我的错误来自哪里?
Auth error:Error: socket hang up
(node:90050) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: Getting metadata from plugin failed with error: socket hang up
【问题讨论】:
-
你不是
.catch()ing。您是在问如何修复未处理的部分或插座挂起的部分吗?实际上,您似乎没有对调用 firestore API 可能返回的 Promises 执行任何操作。 -
这将成为救命稻草,在某处添加: process.on('unhandledRejection', r => console.log(r));并检查您的日志。
-
您在事务中调用
brand.set(...),但您需要调用transaction.set(brand, ....),否则该集合不是事务的一部分。此外,您应该在最后return setWithOptions确保事务等待集合。
标签: node.js google-cloud-firestore