【问题标题】:google cloud function error DEADLINE EXCEEDED谷歌云功能报错DEADLINE EXCEEDED
【发布时间】:2021-04-29 19:52:04
【问题描述】:

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

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 
}

})

【问题讨论】:

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


【解决方案1】:

好的,这样就解决了错误

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 
}

})

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 2018-09-14
    • 2019-06-07
    • 1970-01-01
    • 2019-05-14
    • 2020-09-03
    • 2021-10-12
    • 2019-12-03
    • 2018-12-11
    相关资源
    最近更新 更多