在Firebase函数中获取日期时间值

时间:2019-07-15 13:40:25

标签: typescript firebase-realtime-database google-cloud-functions

我正在尝试获取服务器的日期时间值,并且已经实现了以下代码。但是,时间的返回值有时为null,有时无法按预期工作。

使用https请求代码的主要原因是要检查代码是否已经在今天运行,以使其不重复其操作。

export const helloWorld = functions.https.onRequest((request, response) => {
    response.send("Hello from Firebase!")
    const database = ref.child('Admins/currentDate')
    const timeStamp = admin.database.ServerValue.TIMESTAMP
    const currentTime = new Date(timeStamp)
    const currentDate = currentTime.getDate().toString
    const currentMonth = currentTime.getMonth().toString
    const currentYear = currentTime.getFullYear().toString
    const dateFormat = currentDate + " " + currentMonth + " " + currentYear
    database.once('value').then(function (snapshot) {
        snapshot.forEach(function (data) {
            const appTime = data.val().currentTime
            if(appTime === dateFormat){
                console.log("Points already added today." + dateFormat)
            }
            else{
                console.log("All points successfully updated." + dateFormat)
                data.ref.update({currentTime : dateFormat})
                .catch(console.error)
                udpateAllPoints()
            }
        })
    }).catch(console.error)
})

注意:updateAllPoints()用于将所有用户点增加10%[此代码按预期工作]

function udpateAllPoints(){
    const database = ref.child('Users')
    database.once('value').then( function (snapshot){
        snapshot.forEach(function (data){
            const points = data.val().points
            const updatedPoints = updatePoints(points)
            const userId = data.key
            data.ref.update({ points : updatedPoints})
            .catch(console.error)
            console.log("This User "+ userId +"has "+points+ "points. \n")
        })

    }).catch(console.error)

}

dateFormat的当前示例输出如下:

  1. 运行上述代码时

    function toString() { [native code] } function toString() { [native code] } function toString() { [native code] }   
    
  2. 将其删除为字符串

    function { [native code] } function  { [native code] } function  { [native code] }   
    
  3. 使用Date.Now()或新的Date()代替新的Date(timeStamp)时

    NaN NaN NaN   
    

2 个答案:

答案 0 :(得分:1)

在执行其余功能之前,您正在发送响应。这是行不通的。发送请求后,Cloud Functions几乎立即终止代码。这意味着您的数据库工作可能永远不会发生。

您应该做的是仅在所有异步工作完成之后才发送响应。请参阅documentation

  

使用res.redirect(),res.send()或res.end()终止HTTP函数。

答案 1 :(得分:0)

const currentTime = await new Date()
    const currentDate = currentTime.getDate()
    const currentMonth = currentTime.getMonth()+1
    const currentYear = currentTime.getFullYear()
    const dateFormat = currentDate + " " + currentMonth + " " + currentYear

toString不需要,并且输出是我期望的