【问题标题】:Firebase and Express, my api sends duplicate response each time the value of firebase is changedFirebase 和 Express,每次更改 firebase 的值时,我的 api 都会发送重复响应
【发布时间】:2020-12-21 13:43:55
【问题描述】:

我是 express js 的初学者,我从 express 和 firebase 为我的音乐应用程序制作了 api,它从 firebase 获取数据并接受请求并发送数据作为响应。但是有一个问题正在搞乱程序。每次firebase的值(音乐的Views)发生变化时,它都会重新发送相同的响应。

这是我的代码

app.use(cors())
let trendingTracks = []
let data;
function Trending(data){
    if (data){
        Object.values(data).forEach((value)=>{
            if(value.views < 10){
                trendingTracks.push(value)
            }
        })
    }
}

function SortPopular(a){
    for(let i = 0; i<=a.length; i++){
        for (let j = i+1; j<a.length; j++){
            if(a[i].views>a[j].views){
                const temp = a[i]
                a[i]=a[j]
                a[j]=temp 
            }
        }
    }
    return a
}

firebase.database().ref("public/songs").on("value", snapshot =>{
    data = snapshot.val();
    Trending(data)
})

app.get("/api/home/trending", (req, res)=>{
    res.send(SortPopular(trendingTracks))
})

app.listen(4000, ()=>console.log("listening at port 4000..."))

这是我的数据库的样子:

每次views 的值发生变化时,它都会响应相同的数据。

数据库值不变时:

当数据库的值改变时:

你可以看到同样的东西重新发送。

【问题讨论】:

  • 在 Stack Overflow 上,请不要显示文字和代码的图片。将文本复制到问题本身并设置格式,以便于阅读、复制和搜索。您可以使用底部的编辑链接编辑问题以更正此问题。

标签: javascript node.js firebase express firebase-realtime-database


【解决方案1】:

我没有看到你的整个代码,所以我不能 100% 确定,但我怀疑它的发生是因为你不断地向 trendingTracks 添加项目,但每次运行 Trending 函数时都需要实际清除它。

所以在这里添加trendingTracks = []

app.use(cors())
let trendingTracks = []
let data;
function Trending(data){
    if (data){
        trendingTracks = [] // NEW
        Object.values(data).forEach((value)=>{
            if(value.views < 10){
                trendingTracks.push(value)
            }
        })
    }
}

function SortPopular(a){
    for(let i = 0; i<=a.length; i++){
        for (let j = i+1; j<a.length; j++){
            if(a[i].views>a[j].views){
                const temp = a[i]
                a[i]=a[j]
                a[j]=temp 
            }
        }
    }
    return a
}

firebase.database().ref("public/songs").on("value", snapshot =>{
    data = snapshot.val();
    Trending(data)
})

app.get("/api/home/trending", (req, res)=>{
    res.send(SortPopular(trendingTracks))
})

【讨论】:

  • 我很高兴它有帮助!也请接受我的解决方案(点击投票按钮下方的勾号)。谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2017-12-15
  • 2017-09-14
  • 1970-01-01
  • 2016-01-13
  • 2020-12-29
  • 2016-11-25
相关资源
最近更新 更多