У меня есть рабочий интерфейс приложения чата, использующий только ReactNative и Firebase. Сейчас я пытаюсь преобразовать его в двухслойное приложение (фронтенд и бэкэнд (узел)), используя запросы ax ios. Следующий код работает (только внешний интерфейс):
this.state.dbRef.child(User.phone).child(this.state.person.phone).on('child_added',(value)=>{
this.setState((prevState)=>{
return{
messageList:[...prevState.messageList,value.val()]
}
})
})
Теперь я пытаюсь очистить код для использования Firebase только в бэкэнде, поэтому у меня есть внешний интерфейс:
const getMessages = await api.post('/get',{
recipientPhone:this.state.person.phone,
userPhone:User.phone
})
.then(response => {
this.setState((prevState)=>{
return{
messageList:[...prevState.messageList,response.data]
}
})
})
и, наконец, бэкэнд:
async GetMessages(req,res){
firebase.database().ref('messages').child(req.body.userPhone).child(req.body.recipientPhone).on('child_added',(value,index)=>{
array.push(value.val());
return res.json(array); // Looping error / Cannot set headers after they are sent to the client
})
// return res.json(array); // Async error / Empty array
},
Проблема (короткая):
- Эта функция Firebase работает как цикл, поэтому он получает элементы один за другим, поэтому я не могу вернуть данные внутри него (если не существует какого-либо определенного способа вернуть более одного ответа на запрос) (ошибка: невозможно установить заголовки после их отправки клиенту)
- Я пытаюсь заполнить массив внутри цикла и возвращает его вне области цикла, но он возвращает пустой массив, даже используя async / await
В любом случае, мне нужно заполните этот массив, чтобы вернуть его клиенту, где он будет напечатан, поэтому любая помощь будет полезна.
Спасибо.