1. ホーム
  2. javascript

[解決済み] res.render」は何をするもので、htmlファイルはどのようなものになるのでしょうか?

2022-02-17 14:26:46

質問

<ブロッククオート

とは何ですか? res.render また、そのhtmlファイルはどのようなものでしょうか?

私の最終目標は、テキストファイルから任意のカンマ区切り値をhtmlファイルに読み込むことです(例)。私は、ビューがhtmlファイルであり、コールバックがそのhtmlファイルを返すと推論することができました。

以下はそのドキュメントです。 http://expressjs.com/api.html#res.render .

さて、私が見つけたいくつかのサンプルコードから文脈を考えると、何か ejs (埋め込みjavascript)と <%%> .

しかし、付け加えるとすれば、私が無能なだけなのか、それともドキュメントが本当に曖昧で、読者がすべてを知っていると思い込んでいるのか?どうすれば自分で解決できたのでしょうか?使用方法、利点、落とし穴を完全に理解できるような公式のドキュメントはないのでしょうか?


編集1

私は、このようなことを学ぶのに非常に苦労していることを付け加えておきたいと思います。 node.js . 一般的なドキュメントが本当に曖昧なのは、私のせいでしょうか?上記のようないい加減な説明はともかく、パラメータや戻り値の型指定がないのです。


編集2

コードの上でもう少し具体的な質問をさせてください。

実際の orders.ejs ファイルは views/orders.ejs . このコードはどのようにそれを参照しているのでしょうか?

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>
     <% } %>

そして、js。/ordersをご覧ください。

  // 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);
        });
      }
    });
  }
};

解決方法は?

<ブロッククオート

res.renderは何をし、htmlファイルはどのようなものになるのでしょうか?

res.render() 機能 テンプレートをコンパイルします。 (ejsは使わないでください)、そこにlocalsを挿入し、これら2つのものからhtml出力を作成します。


回答 編集2 の部分です。

// 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});

つまり、テンプレートパスは views/ (最初の部分) + orders (後半部分) + .ejs (第3部) === views/orders.ejs


とにかく、express.jsのドキュメントは、何をするにも良いものです。APIリファレンスであって、node.jsの使い方の本ではありません。