2017-08-23 1 views
0

C'est mon premier projet dans le développement web en général et j'utilise ExpressJS et MongoDB. Je veux fondamentalement cliquer sur un bouton dans ma page de vue et puis obtenir une donnée spécifique dans la base de données (mongodb) pour montrer le contenu juste au-dessus de l'élément de bouton. C'est ce que j'ai jusqu'à présent:Obtenez une valeur de base de données en utilisant mongoose et en affichant dans la même page (ExpressJS et MongoDB)

Mon schéma (J'ai un schéma différent pour les utilisateurs, mais c'est celui dont je veux obtenir les données).

const mongoose = require('mongoose'); 

// Redacao Schema 
var RedacaoSchema = mongoose.Schema({ 
    testing1: { 
    type: String 
    } 
    }); 

var Redacao = module.exports = mongoose.model('Redacao', RedacaoSchema); 

Ici, je veux cliquer sur un bouton, obtenir des données spécifiques de la base de données et faire apparaître sur la même page au-dessus du bouton. J'utilise le guidon comme moteur de vue. Mon point de vue:

<div id="target"> 
</div> 

<input id="receberRedacao" type="button" value="User data"> 

<script> 
$(document).ready(function(){ 
    $('#receberRedacao').click(function (e) { 
     e.preventDefault(); 
     $.ajax({ 
      url: "https://stackoverflow.com/users/usuario/redacaoteste", 
      type: "get", 
     }); 
     console.log(texto1); 
     $("<div id='redacao-usuario'>A redação do usuário está aqui. >>> {{texto1}} </div>").appendTo('#target'); 
    }); 
}); 
</script> 

Mon routeur:

var express = require('express'); 
var router = express.Router(); 
var Redacao = require('../models/redacao'); 

router.get('/usuario/redacaoteste', function(req, res) { 
    var texto1 = Redacao.findOne({}); 
    console.log('>>>', texto1); //testing the variable I get something crazy 
    res.render('usuario', {texto1}); 
}); 

module.exports = router; 

Répondre

0

Vous devez utiliser un rappel comme findOne est asynchrone:

router.get('/usuario/redacaoteste', function(req, res) { 
    Redacao.findOne({}, function(err, doc) { 
     if (err) { 
      // Handle error here 
     } 
     console.log('>>>', doc); 
     res.render('usuario', doc); 
    }); 
}); 
0

Je trouve les réponses de mon code problématique. Je posterai les réponses ici car elles peuvent aider les autres.

Côté serveur: 1º Je devrais avoir une promesse de gérer les erreurs lors de la recherche d'une variable dans la base de données. 2º Impossible d'utiliser res.render. Il devrait être res.json de passer la variable, sinon il retournera le code html entier. Côté client: J'ai manqué la fonction de succès dans la requête Ajax.

function successCallback(responseObj){ 
    console.log(responseObj); 
}; 

$(document).ready(function(){ 
    $('#receberRedacao').click(function (e) { 
     e.preventDefault(); 

     $.ajax({ 
      url: "https://stackoverflow.com/users/usuario/receber", 
     type: "get", 
     success: function(response){ 
       successCallback(response); 
      } 
     }); 
    }); 
});