Firebase и Express, мой API отправляет повторяющийся ответ каждый раз, когда значение firebase изменяется

Я новичок в экспресс js, я сделал api для своего музыкального приложения из экспресс и firebase, который берет данные из firebase и принимает запрос и отправляет данные в качестве ответа. Но есть проблема, которая портит программу. Каждый раз, когда значение (Views музыки) Firebase изменяется, он повторно отправляет один и тот же ответ.

Вот мой код

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.info("listening at port 4000..."))

Вот как выглядит моя база данных:

И каждый раз, когда значение views изменяется, оно отвечает одним и тем же данным.

Когда значение базы данных не изменяется:

При изменении значения базы данных:

Как вы можете видеть, то же самое повторно посылает.

В Stack Overflow, пожалуйста, не показывайте изображения текста и кода. Скопируйте текст в сам вопрос и отформатируйте его так, чтобы его было легко читать, копировать и искать. Вы можете отредактировать вопрос, чтобы исправить это, используя ссылку редактирования внизу.

Doug Stevenson 21.12.2020 07:44
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
1
1
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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))
})

Я рад, что это помогло! Пожалуйста, также примите мое решение (нажмите на галочку под кнопками голосования). Спасибо! :)

IvanD 21.12.2020 06:47

Другие вопросы по теме