谷歌云功能错误 DEADLINE EXCEEDED

时间:2021-01-26 00:44:28

标签: node.js typescript google-cloud-platform google-cloud-firestore google-cloud-functions

我正在尝试编写一个简单的发布/订阅触发的云函数来更新我的 Firestore 股票集合。我收到了一堆奇怪的错误消息,其中一个突出显示错误:4 DEADLINE_EXCEEDED:超过截止日期。更奇怪的是,有些股票可以正确更新,而有些则不能。我是 Javascript/Typescript 的新手,所以很明显我对如何在这种情况下返回承诺有一些误解。这里的想法是非常简单的循环遍历集合中的每个股票行情,请求更新数据,然后更新现有文档数据并保存

export const updateChart = functions.pubsub.schedule('35 16 * * 1-5').timeZone('America/New_York').onRun(async(_context) => {
const key = functions.config().services.key as string 
const db = admin.firestore()
const charts5DRef = db.collection("charts5D")
var needsUpdate : boolean = true 
// I cut off some unrelated code for brevity sake 
if (needsUpdate){
    const snapshot = await charts5DRef.get()
    var path = ``
    const timestamp = Date.now() / 1000
    return snapshot.forEach(async function(document){ // this  could contain 100's of stock tickers
        const ticker = document.id
        const docData = document.data()
        var labels = docData.labels as [string]
        var marketNotional = docData.marketNotional as [number]
        var marketTrades = docData.marketNumberOfTrades as [number]
        var dates = docData.dates as [string]
        var closings = docData.close as [number]
        var volume = docData.marketVolume as [number]
        path = `apiUrl to get data`
        const options = {
            method : 'GET',
            uri : path,
            resolveWithFullResponse : true,
        }
        await req(options).then(async(response)=>{
            if(response.statusCode === 200){
                const resultData = JSON.parse(response.body)
                const updatedPrices = resultData as [IntradayPrice]
                updatedPrices.forEach(function(value){
                    if(value.close !== undefined){
                        closings.splice(0,1)
                        marketTrades.splice(0,1)
                        marketNotional.splice(0,1)
                        labels.splice(0,1)
                        dates.splice(0,1)
                        volume.splice(0,1)
                        closings.push(value.close)
                        dates.push(value.date)
                        if(value.label !== undefined){ labels.push(value.label) } else { labels.push("") }
                        if(value.marketNotional !== undefined) { marketNotional.push(value.marketNotional) } else { marketNotional.push(0) }
                        if(value.marketNumberOfTrades !== undefined) { marketTrades.push(value.marketNumberOfTrades) } else { marketTrades.push(0) }
                        if(value.marketVolume !== undefined) { volume.push(value.marketVolume) } else { volume.push(0) }
                    }
                })
                await charts5DRef.doc(ticker).set({lastUpdate : timestamp,close : closings, labels : labels, marketVolume : volume,marketNumberOfTrades : marketTrades, marketNotional : marketNotional, dates : dates}).then(()=>{
                    console.log(`Updated ${ticker} 5Dchart successfully`)
                }).catch((error)=>{
                    console.log(error) 
                })
            }
        }).catch((error)=>{
            console.log(error)
        })
    }) 
}else{
    console.log("Markets closed")
    return 
}

})

1 个答案:

答案 0 :(得分:0)

好的,这样就解决了错误

export const updateChart = functions.pubsub.schedule('35 16 * * 1-5').timeZone('America/New_York').onRun(async(_context) => {
const key = functions.config().services.key as string 
const db = admin.firestore()
const charts5DRef = db.collection("charts5D")
var needsUpdate : boolean = false 

if (needsUpdate){
    const snapshot = await charts5DRef.get()
    var path = ``
    const timestamp = Date.now() / 1000
    const promises : bird<void>[] = []  
    snapshot.forEach(async function(document){
        const ticker = document.id
        const docData = document.data()
        var labels = docData.labels as [string]
        var marketNotional = docData.marketNotional as [number]
        var marketTrades = docData.marketNumberOfTrades as [number]
        var dates = docData.dates as [string]
        var closings = docData.close as [number]
        var volume = docData.marketVolume as [number]
        path = `https://cloud.iexapis.com/stable/stock/${ticker}/intraday-prices?token=${key}&chartInterval=10`
        const options = {
            method : 'GET',
            uri : path,
            resolveWithFullResponse : true,
        }
        const promise = req(options).then(async(response)=>{
            if(response.statusCode === 200){
                const resultData = JSON.parse(response.body)
                const updatedPrices = resultData as [IntradayPrice]
                updatedPrices.forEach(function(value){
                    if(value.close !== undefined){
                        closings.splice(0,1)
                        marketTrades.splice(0,1)
                        marketNotional.splice(0,1)
                        labels.splice(0,1)
                        dates.splice(0,1)
                        volume.splice(0,1)
                        closings.push(value.close)
                        dates.push(value.date)
                        if(value.label !== undefined){ labels.push(value.label) } else { labels.push("") }
                        if(value.marketNotional !== undefined) { marketNotional.push(value.marketNotional) } else { marketNotional.push(0) }
                        if(value.marketNumberOfTrades !== undefined) { marketTrades.push(value.marketNumberOfTrades) } else { marketTrades.push(0) }
                        if(value.marketVolume !== undefined) { volume.push(value.marketVolume) } else { volume.push(0) }
                    }
                })
                await charts5DRef.doc(ticker).set({lastUpdate : timestamp,close : closings, labels : labels, marketVolume : volume,marketNumberOfTrades : marketTrades, marketNotional : marketNotional, dates : dates}).then(()=>{
                    console.log(`Updated ${ticker} 5Dchart successfully`)
                }).catch((error)=>{
                    console.log(error) 
                })
            }
        }).catch((error)=>{
            console.log(error)
        })
        promises.push(promise) 
    })
    return Promise.all(promises).then(()=>{
        console.log("All good")
    }).catch((error)=>{
        console.log(error)
    })
}else{
    console.log("Markets closed")
    return 
}

})