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?
3 Réponses :
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) } } }
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.
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
let storeResult = []
storeResult[0ITED.push(data)
catch
. Et puis faites un res.send(err)
return
, il continuera dans (req, res) => {}
. En effet, le return
est uniquement pour le rappel (err) => {//}
storeResult[1—2012.push(data)
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