web-dev-qa-db-fra.com

Que fait "res.render" et à quoi ressemble le fichier html?

Que fait res.render et à quoi ressemble le fichier html? 

Mon objectif final est de charger des valeurs arbitraires, séparées par des virgules, d'un fichier texte dans un fichier HTML (par exemple). Je n'ai pu que déduire qu'une vue était le fichier html et callback renvoie ce fichier html.

Voici la documentation: http://expressjs.com/api.html#res.render .

Maintenant, étant donné le contexte de l'exemple de code que j'ai trouvé, l'utilisation de ejs (javascript intégré) avec <% et %> a quelque chose de particulier. 

Mais si je peux ajouter, suis-je simplement incompétent ou la documentation est-elle vraiment vraiment vague et suppose que le lecteur sache tout? Comment aurais-je pu résoudre ce problème moi-même? Existe-t-il une documentation officielle pour que je puisse bien comprendre l'utilisation, les avantages et les inconvénients?


Modifier 1 

Je veux juste ajouter que je passe énormément de temps à apprendre node.js. Est-ce moi ou la documentation générale est-elle vraiment vague? Mis à part les explications moche comme ci-dessus, il n'y a pas de spécification de type pour les paramètres ou les valeurs de retour.


Edit 2

Laissez-moi vous poser quelques questions plus spécifiques au-dessus du code.

Le fichier orders.ejs actuel est dans views/orders.ejs. Comment ce code s'y réfère-t-il?

Extrait HTML:

<tbody>
  <% for(var i=0; i<orders.length; i++) {%>
     <tr>
       <td><%= orders[i].id %></td>
       <td><%= orders[i].amount %></td>
       <td><%= orders[i].time %></td>
     </tr>
     <% } %>

Et les js. S'il vous plaît voir/commandes:

  // Define routes for simple SSJS web app. 
// Writes Coinbase orders to database.
var async   = require('async')
  , express = require('express')
  , fs      = require('fs')
  , http    = require('http')
  , https   = require('https')
  , db      = require('./models');

var app = express();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.set('port', process.env.PORT || 8080);

// Render homepage (note trailing slash): example.com/
app.get('/', function(request, response) {
  var data = fs.readFileSync('index.html').toString();
  response.send(data);
});

// Render example.com/orders
app.get('/orders', function(request, response) {
  global.db.Order.findAll().success(function(orders) {
    var orders_json = [];
    orders.forEach(function(order) {
      orders_json.Push({id: order.coinbase_id, amount: order.amount, time: order.time});
    });
    // Uses views/orders.ejs
    response.render("orders", {orders: orders_json});
  }).error(function(err) {
    console.log(err);
    response.send("error retrieving orders");
  });
});

// Hit this URL while on example.com/orders to refresh
app.get('/refresh_orders', function(request, response) {
  https.get("https://coinbase.com/api/v1/orders?api_key=" + process.env.COINBASE_API_KEY, function(res) {
    var body = '';
    res.on('data', function(chunk) {body += chunk;});
    res.on('end', function() {
      try {
        var orders_json = JSON.parse(body);
        if (orders_json.error) {
          response.send(orders_json.error);
          return;
        }
        // add each order asynchronously
        async.forEach(orders_json.orders, addOrder, function(err) {
          if (err) {
            console.log(err);
            response.send("error adding orders");
          } else {
            // orders added successfully
            response.redirect("/orders");
          }
        });
      } catch (error) {
        console.log(error);
        response.send("error parsing json");
      }
    });

    res.on('error', function(e) {
      console.log(e);
      response.send("error syncing orders");
    });
  });

});

// sync the database and start the server
db.sequelize.sync().complete(function(err) {
  if (err) {
    throw err;
  } else {
    http.createServer(app).listen(app.get('port'), function() {
      console.log("Listening on " + app.get('port'));
    });
  }
});

// add order to the database if it doesn't already exist
var addOrder = function(order_obj, callback) {
  var order = order_obj.order; // order json from coinbase
  if (order.status != "completed") {
    // only add completed orders
    callback();
  } else {
    var Order = global.db.Order;
    // find if order has already been added to our database
    Order.find({where: {coinbase_id: order.id}}).success(function(order_instance) {
      if (order_instance) {
        // order already exists, do nothing
        callback();
      } else {
        // build instance and save
          var new_order_instance = Order.build({
          coinbase_id: order.id,
          amount: order.total_btc.cents / 100000000, // convert satoshis to BTC
          time: order.created_at
        });
          new_order_instance.save().success(function() {
          callback();
        }).error(function(err) {
          callback(err);
        });
      }
    });
  }
};
23
user2316667

Que fait res.render et à quoi ressemble le fichier html?

res.render() function compile votre modèle (veuillez ne pas utiliser ejs), y insère des variables locales et crée une sortie HTML à partir de ces deux éléments.


Répondre Edit 2 part.

// here you set that all templates are located in `/views` directory
app.set('views', __dirname + '/views');

// here you set that you're using `ejs` template engine, and the
// default extension is `ejs`
app.set('view engine', 'ejs');

// here you render `orders` template
response.render("orders", {orders: orders_json});

Ainsi, le chemin du modèle est views/ (première partie) + orders (deuxième partie) + .ejs (troisième partie) === views/orders.ejs


Quoi qu’il en soit, la documentation d’express.js est très utile. C'est une référence d'API, pas un livre "Comment utiliser node.js".

22
alex

Rend une vue et envoie la chaîne HTML rendue au client.

res.render('index');

Ou

res.render('index', function(err, html) {
  if(err) {...}
  res.send(html);
});

DOCS ICI: https://expressjs.com/fr/api.html#res.render

0
sultan aslam