2016-10-11 1 views
0

Je suis au service d'une page Web statique de Node.JS via serveur Web Express:moyen le plus simple d'intégrer du contenu dynamique dans la page statiquement servi sur Node.JS via Express

app.use('/', express.static('public')); 

Quelle est la façon la plus minimaliste d'intégrer une dynamique contenu, par exemple une liste d'éléments récupérés d'une base de données dans une telle page? Je vois la possibilité de « faux » un fichier .js sur le serveur qui est réellement créé dynamiquement puis chargé dans un index.html qui se trouve dans le dossier public sur le serveur:

app.get('/myScript.js', (req, res) => { 
    data = getDataFromDatabase(); 
    res.send('var data1 = ' + data[0] + '; var data2 = ' + data[1]); 
}); 

Cela semble très hacky et je Je me demande quelle est la meilleure approche minimaliste.

+1

Étant donné que vous demandez à son approche raisonnable. Si les données ne changent pas si souvent ou sont sous votre contrôle, vous pouvez même écrire le fichier lorsque les données changent et il ne devrait pas être dynamique du tout. Cependant, une chose à considérer est de renvoyer les données car JSON vous aidera à éviter les problèmes d'échappement de texte. – bknights

+0

Si je vous ai bien compris, vous voulez essentiellement récupérer des données et rendre ces données dans votre page principale? Si c'est le cas, pourquoi ne pas utiliser un moteur de vue comme ejs? – n0m4d

+0

@ n0m4d Je cherchais une solution minimale sans moteur de vue mais je vois que cela pourrait bien être la solution. Je vous remercie. – Sebastian

Répondre

0

Vous pouvez également renvoyer une réponse d'un rappel à l'intérieur de votre itinéraire get. Je fais quelque chose comme ceci:

Endpoint:

router.get('/people', (req, res) => { 
    People.list((error, response) => { 
     if (error) return res.end(); 
     return res.send(response); 
    }); 
}); 

Modèle:

module.exports = { 
    connect: (callback) => { 
     r.connect({ 
      host: config.db.host, 
      port: config.db.port, 
      db: config.db.name 
     }) 
     .then((connection) => { 
      return callback(null, connection); 
     }) 
     .error((err) => { 
      return callback(err); 
     }); 
    }, 
    list: function (callback) { 
     this.connect((err, connection) => { 
      if (err) return callback(err); 
      r.db(config.db.name).table(config.db.tables.people) 
      .run(connection) 
      .then((cursor) => { 
       return cursor.toArray(); 
      }) 
      .then((users) => { 
       return callback(null, users); 
      }) 
      .error((err) => { 
       return callback(err); 
      }); 
     }); 
    }, 
    ... 

Avec cela, alors je reçois l'objet de réponse à imprimé mon écran. Le code du modèle est le code rethinkdb, mais vous pouvez le remplacer par ce que vous utilisez. Désolé si ce n'était pas tout à fait ce que vous étiez après. Bonne chance avec votre construction =)

+0

Je ne vois pas que cela soit significativement différent de l'exemple de ma question. La principale différence est que vous passez le 'res.send' d'un rappel. – Sebastian

+0

Vous avez raison. Je montrais juste une autre façon de gérer cela avec un rappel pour récupérer votre objet de réponse. –