2014-02-18 46 views
18

res.render是做什麼用的,html文件是什麼樣的?「res.render」做了什麼,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。請參閱/訂單:

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

您對文檔含糊不清是錯誤的。當你獲得更多經驗時,也許你可以更新它們。我會,但我可能沒有比你更多的經驗。 – trysis

回答

17

是什麼res.render做,什麼是HTML文件是什麼樣子?

res.render()功能編譯模板(請不要使用EJS),插入當地人那裏,並創建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(第三部分)=== views/orders.ejs


反正express.js文檔是好的它能做什麼。它是API參考,而不是「如何使用node.js」的書。

+0

謝謝你的回覆!爲什麼不使用ejs?那我該用什麼?我知道它不能用於教我的語法,但我認爲render()是一種由express提供的方法,它不能解釋它自己的功能。我上面發佈了代碼。我真的很困惑它如何訪問views/order.ejs,因爲渲染的第一個參數就是「命令」。我認爲views子目錄和.ejs文件類型是自動的,但現在我聽說它是​​可選的嗎? – user2316667

+0

回答問題的第一部分,'ejs'不會將可執行代碼與模板分開。有時作爲通用模板語言是很好的,但是'jade'或''handlebars'通常更適合生成html。 – alex

+0

已編輯的帖子來回答您的編輯。 – alex