Quelle est la bonne façon de parcourir une masortingce dans un modèle EJS après un appel AJAX (avec ExpressJS)?

J’essaie donc de parcourir en boucle un tableau d’objects obtenus d’un appel http en utilisant mon API interne à l’aide du module / package de request . Jusqu’à présent, je suis en mesure de récupérer mes données depuis l’API et d’afficher l’object complet sur ma page. Je voudrais l’afficher sur ma page et le parcourir en utilisant le système de modèles EJS. Je sais que je peux utiliser AngularJS pour les éléments frontaux, mais j’aimerais voir jusqu’où je peux aller avec uniquement du côté serveur.

Donc ci-dessous est mon code:

server.js

 // Prepend /api to my apiRoutes app.use('/api', require('./app/api')); 

api.js

 var Report = require('./models/report'); var express = require('express'); var apiRoutes = express.Router(); apiRoutes.route('/reports', isLoggedIn) .get(function (req, res,next) { // use mongoose to get all reports in the database Report.find(function (err, reports) { // if there is an error resortingeving, send the error. // nothing after res.send(err) will execute if (err) return res.send(err); res.json(reports); }); }); 

routes.js

 var User = require('./models/user'); var request = require('request'); module.exports = function (app, passport) { app.get('/reports', isLoggedIn, function (req, res) { res.render('pages/new-report.ejs', { user: req.user, title:'New Report' }); }); request({ uri:'http://localhost:2016/api/reports', method:'GET' }).on('data',function(data){ console.log('decoded chunk:' + data) }).on('response',function(resp){ resp.on('data', function(data){ console.log('received:' + data.length + ' bytes of compressed data'); app.get('/timeline', isLoggedIn, function (req, res) { res.render('pages/timeline', { user: req.user, title:'Timeline', reports: data }); }); }) }); } 

reportages.ejs
Donc, si je produis simplement tout l’object de reports tel que celui-ci

sur ma page, tout fonctionne correctement et le résultat obtenu est le suivant:

 [ { "_id": "5775d396077082280df0fbb1", "author": "57582911a2761f9c77f15528", "dateTime": "30 June 2016 - 07:18 PM", "picture": "", "description": "", "location": [ -122.46596999999997, 37.784495 ], "latitude": 37.784495, "longitude": -122.46596999999997, "address": "4529 California St, San Francisco, CA 94118, USA", "contact": "John Doe", "type": "Financial", "__v": 0, "updated_at": "2016-07-01T02:21:10.259Z", "created_at": "2016-07-01T02:21:10.237Z", "tags": [ "tag1,tag2" ] } ] 

Mais si j’essaie de parcourir en boucle l’object tel que vu ci-dessous, il devient UNDEFINED en tant que propriété de retour de mon object de rapport et une boucle infinie, apparemment.

 

J’ai essayé une autre variante de la boucle mais je n’ai toujours pas réussi:

 
    <% for (var i = 0; i
  • 4/10/13

La syntaxe de la boucle for dans ejs est parfaite, mais le nom du tableau itéré est reports et vous semblez utiliser report [i] dans l’itération, qui doit être modifiée en tant que reports [i] , ce qui devrait fonctionner.

reportages.ejs

 
    <% for (var i = 0; i < reports.length; i++) { %>
  • <%= reports[i].type %> 4/10/13 <%= reports[i].dateTime %>
  • <% } %>

J’espère que cela t’aides.

Async est un module utilitaire qui fournit des fonctions simples et puissantes pour travailler avec du JavaScript asynchrone. Bien que conçu à l’origine pour une utilisation avec Node.js et installable via

npm install --save async

Pour la documentation, visitez http://caolan.github.io/async/

Exemples

 // assuming openFiles is an array of file names and saveFile is a function // to save the modified contents of that file: async.each(openFiles, saveFile, function(err){ // if any of the saves produced an error, err would equal that error }); // assuming openFiles is an array of file names async.each(openFiles, function(file, callback) { // Perform operation on file here. console.log('Processing file ' + file); if( file.length > 32 ) { console.log('This file name is too long'); callback('File name too long'); } else { // Do work to process file here console.log('File processed'); callback(); } }, function(err){ // if any of the file processing produced an error, err would equal that error if( err ) { // One of the iterations produced an error. // All processing will now stop. console.log('A file failed to process'); } else { console.log('All files have been processed successfully'); } });