Description
Chaque fois que j'inclus response.send(snapshot.val()); , cette erreur se produit et le serveur NodeJS plante. J'utilise Postman pour tester le point de terminaison de l'API avec Header, cela fonctionne correctement.

Sortie

On terminal 401 Unauthorized 

[2020-11-05T13:23:24.421Z]  @firebase/database: FIREBASE WARNING: Exception was thrown by user callback. Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

NodeJS

const getsRoute = require('./routes/gets');
app.use('/api/v1', getsRoute);

//on other file
const auth = require('../middleware/auth');
router.get('/products', auth, (req, res) => {
    initialPage.getBusinesses(res);
});

Code pour produire une erreur

const initialPage = {
    getBusinesses(response) {
        ref.orderByKey()
        .limitToLast(20)
        .on('value', function(snapshot){
            response.json(snapshot.val()); 
            return snapshot.val();
        })
    }
}

Côté client utilisant React Native

  searchApi = async() => {
        const response = await axios.get('http://33c75838823c90.ngrok.io/api/v1/products',{
                headers: {
                    "Content-Type": "application/json",
                    "Accept": "application/json",
                    "x-auth-token":"jgiiHDgfdeizI1NiIJ9.eyJfaWQiOiI1ZmEwMWMzZmM4YjIwYjBjZDQyMmJkNzUiLCJpYXQiOjE2MDQ0MTAwMDZ0KwFAgVtsJUQw"
                }
            }
        ).catch((error) => {
            console.log("ERROR FROM AXIOS:", error)
          });
        console.log("RESPONSE DATA: %%%%%%%", response.data)
        this.setState({results: [response.data]});
       
    }

J'ai vérifié tant de documents et de questions sur le forum, mais personne n'obtient exactement la solution à un problème général.

0
Phok Chanrithisak 5 nov. 2020 à 16:29

1 réponse

Meilleure réponse

Le problème est ici:

getBusinesses(response) {
    ref.orderByKey()
    .limitToLast(20)
    .on('value', function(snapshot){
        response.json(snapshot.val()); 
        return snapshot.val();
    })
}

Puisque vous utilisez on(...), votre rappel sera appelé :

  1. Dès que les données sont chargées,
  2. Après cela, à chaque fois que les données changent.

Le premier fonctionne comme prévu, mais si les données changent, cela signifie que vous essayez d'envoyer une autre réponse, ce qui est à l'origine de l'erreur.

Pour résoudre ce problème, utilisez once au lieu de on :

getBusinesses(response) {
    ref.orderByKey()
    .limitToLast(20)
    .once('value', function(snapshot){
        response.json(snapshot.val()); 
        return snapshot.val();
    })
}
1
Frank van Puffelen 5 nov. 2020 à 14:20