【发布时间】:2019-11-18 02:47:45
【问题描述】:
我设置了一个带有 firebase 函数的 pubsub 函数,以便经常在 Firestore 中执行一些操作。为此,我需要向第三方 API 发出请求以获取更新的数据,然后我想将该数据插入到 Firestore 中正确的集合和文档中。
const request_promise = require('request-promise')
exports.scheduledFunction = functions.pubsub.schedule('every 2 minutes').onRun((context) => {
console.log('This will be called every 2 minutes')
var username = ''
var password = ''
var options = {
url: 'path.to.api.com',
auth: {
user: username,
password: password
},
json: true
}
request_promise(options)
.then(function (product) {
console.log(product.product_id)
db.collection('products').doc(product.product_id).set(product)
.then(() => {
console.log('Document successfully written')
})
.catch(error => {
console.log('Error writing product to firestore', error)
})
})
.catch(function (err) {
console.log('Failed to get product', error)
})
});
在上面的代码中,如果我注释掉将数据添加到 Firestore 的调用,我会将正确的 product_id 打印到控制台,因此我知道请求正在运行,但如果将其留在我得到“函数返回未定义,预期的承诺”或价值'。
【问题讨论】:
-
require('request_promise')将是require('request-promise') -
您需要返回一个在所有异步工作完成后解决的承诺。现在,您忽略了
request_promise()和db.collection().doc().set()返回的承诺。您将需要学习如何有效地使用 JavaScript Promise,以便让 Cloud Functions 执行您想要的操作。 -
另外,
request_promise(options).then(..)到return request_promise(options).then(..)
标签: node.js firebase express google-cloud-firestore google-cloud-functions