1
votes

Obtention d'une erreur: impossible de définir les en-têtes après leur envoi

J'essaie d'implémenter la fonctionnalité de recherche dans Node, mongoose.
Il y a deux paramètres que j'aime rechercher, soit par nom ou par artiste. Si l'un des deux correspond à la base de données actuelle, il doit renvoyer une valeur (ce qui la rend reposante)

Cependant, il envoie une réponse Erreur: Impossible de définir les en-têtes après leur envoi.
et Les rejets de promesses non gérées sont obsolètes et même la réponse que j'obtiens est vide

J'essaie d'exécuter deux requêtes, ce qui, je pense, pourrait être le problème. Comment dois-je l'écrire, ou quelle est la manière correcte d'écrire ce type de fonctionnalité

Voici mon code actuel

app.get ('/ search /: textValue ', controller.findData)

et findData

exports.findData = (req, res)=>{

    const searchParam = req.params.textValue;
    let storeResult = []
    if(searchParam==null|| searchParam == undefined || searchParam==""){
        return res.status(500).json("Send a valid input")
     }
  else{
        Song.find({artists: new RegExp(searchParam, "i")}).lean().then((data)=>{
            storeResult[0].push(data)
        }).catch((err)=>{
            return res.send(err)
        })

        Song.find({name: new RegExp(searchParam, "i")}).lean().then((data)=>{
            storeResult[1].push(data)
        }).catch((err)=>{
            return res.send(err)
        })

        return res.send(storeResult)
    }
}

Ils fonctionnent parfaitement pour des requêtes uniques, quelles modifications devraient être apportées ici?


0 commentaires

3 Réponses :


1
votes

Essayez ceci:

exports.findData = (req, res)=>{
    let count=0;
    const searchParam = req.params.textValue;
    let storeResult = []
    if(searchParam==null|| searchParam == undefined || searchParam==""){
        return res.status(500).json("Send a valid input")
     }
  else{
        Song.find({artists: new RegExp(searchParam, "i")}).lean().then((data)=>{
            storeResult[0].push(data)
        }).catch((err)=>{
            count++;
            return res.send(err)
        })
        if(count == 0) {
            Song.find({name: new RegExp(searchParam, "i")}).lean().then((data)=>{
                storeResult[1].push(data)
            }).catch((err)=>{
                count++;
                return res.send(err)
            })
        }
        if(count == 0) {
            return res.send(storeResult)
        }
    }
}


0 commentaires

1
votes

De la manière dont vous l'avez, vous utilisez res.send (storeResult) avant de renseigner storeResult . Comment? Vous le remplissez avec vos rappels .then () , qui n'ont pas encore été appelés.

Essayez de chaîner vos rappels puis .

 Song.find({artists: new RegExp(searchParam, "i")}).lean()
.then((data)=>{
    storeResult.push(data);
})
.then(() => {
    Song.find({name: new RegExp(searchParam, "i")}).lean()
    .then((data)=>{

        storeResult.push(data)
    })
    .then(() => {
        console.log(storeResult)
        res.send(storeResult)
    })  
})
.catch((err)=>{
    console.log("Here is error")
    console.log(err)
    res.send(err)
})
}

Indice. L'intervention dans votre débogueur est utile pour résoudre ce type de code.


4 commentaires

désolé mon mal, j'oublie le comportement asynchrone :-(


Merci pour votre aide, cependant, j'ai essayé d'utiliser votre code, il manquait quelques crochets, et j'ai finalement fini par avoir une promesse imbriquée


Désolé pour les fautes de frappe. Merci de les avoir réparés.


Merci d'avoir répondu, c'était stupide de ma part d'oublier le comportement asynchrone



1
votes

  • Vous commencez avec un tableau vide let storeResult = []
  • Ensuite, vous accédez à son premier élément (qui n'existe pas) storeResult[0ITED.push(data)
  • Cela déclenchera votre rappel catch . Et puis faites un res.send(err)
  • Même si vous avez appelé return , il continuera dans (req, res) => {} . En effet, le return est uniquement pour le rappel (err) => {//}
  • Même chose avec storeResult[1—2012.push(data)
  • Enfin, vous appelez return res.send (storeResult) qui termine efficacement votre rappel (req, res) => {} et renvoie une autre réponse au client li>

    Lorsque vous poussez vers votre tableau storeResult , omettez l'index. Comme ceci

    storeResult.push(data)
    

    Remarque

    Même en poussant correctement, une erreur peut se produire lors de l'accès à la base de données. C'est pourquoi vous également devez chaîner vos rappels comme O. La réponse de Jones dit


  • 0 commentaires