2011-12-28 26 views
10

में ejs फ़ाइल प्रस्तुत करें अरे दोस्तों मैं node.js के साथ खेल रहा हूं और एक टेम्पलेट फ़ाइल प्रस्तुत करने की कोशिश कर रहा हूं। मैंने स्ट्रिंग्स को प्रस्तुत करने का तरीका बताया:node.js

var http = require('http'); 
var ejs = require('ejs'); 

var server = http.createServer(function(req, res){ 
    res.end(ejs.render('Hello World')); 
}); 

server.listen(3000); 

मैं टेम्पलेट फ़ाइल कैसे प्रस्तुत कर सकता हूं?

var server = http.createServer(function(req, res){ 
    res.end(ejs.render(templateString)); 
}); 
+1

तो आप एक स्ट्रिंग प्रस्तुत कर सकते हैं, क्यों न केवल स्ट्रिंग के रूप में टेम्पलेट फ़ाइल को पढ़ते हैं और इसे वहां से ले जाते हैं? – sczizzo

+0

तथ्य यह है कि, मैं node.js के लिए इतना नया हूं, मुझे नहीं पता कि फ़ाइलों को कैसे पढ़ा जाए: डी। हो सकता है कि मेरे लिए टेम्पलेट इंजन का उपयोग शुरू करना बहुत जल्दी हो ... – Headshota

उत्तर

16
var templateString = null; 
var fs = require('fs'); 
var templateString = fs.readFileSync('template.ejs', 'utf-8'); 

और उसके बाद आपको अपना काम करने इस पैटर्न का एक तुल्यकालिक संस्करण है जो इसे थोड़ा और मजबूत करता है।

var server = http.createServer(function(req, res) { 
    var filePath = __dirname + '/sample.html'; 
    var template = fs.readFileSync(filePath, 'utf8'); 
    res.end(ejs.render(template,{})); 
}); 

नोट के उपयोग readFileSync()। यदि आप एन्कोडिंग (utf8 यहां) निर्दिष्ट करते हैं, तो फ़ंक्शन आपके टेम्पलेट वाले स्ट्रिंग को लौटाता है।

+3

यह गलत है। ReadFile async फ़ंक्शन है, इसलिए सर्वर पर अनुरोध होने पर टेम्पलेट स्ट्रिंग शून्य हो सकती है। आप इसके बजाय 'readFileSync' को कॉल करेंगे या कॉलबैक – karaxuna

+0

@karaxuna के बाद सर्वर प्रारंभ करेंगे: आप काफी सही हैं, धन्यवाद। अब तय मुझे नहीं पता कि जब आपने इसे बनाया था तो मैंने आपकी टिप्पणी क्यों छोड़ी ... – Amadan

+0

यदि आप सिंक फ़ंक्शन का उपयोग करते हैं तो उसके पास कोई कॉलबैक नहीं है। तो यह होगा: 'var templateString = fs.readFileSync ('template.ejs', 'utf-8');' – karaxuna

5

तुम सब एक स्ट्रिंग के रूप फ़ाइल (वैकल्पिक स्थानीय चर के साथ) संकलन करना है, इसलिए जैसे:

var fs = require('fs'), ejs = require('ejs'), http = require('http'), 
     server, filePath; 
filePath = __dirname + '/sample.html'; // this is from your current directory 
fs.readFile(filePath, 'utf-8', function(error, content) { 
    if (error) { throw error); } 
    // start the server once you have the content of the file 
    http.createServer(function(req, res) { 
    // render the file using some local params 
    res.end(ejs.render(content, { 
     users: [ 
     { name: 'tj' }, 
     { name: 'mape' }, 
     { name: 'guillermo' } 
     ] 
    }); 
    }); 
}); 
3

+1

एक वास्तविक सर्वर पर ऐसा करने से प्रदर्शन पर असर पड़ेगा। –

21

EJS में एक गैर-दस्तावेजी समारोह फ़ाइलें रेंडर करने के लिए नहीं है, तो आप सिर्फ कर सकते हैं ...

ejs.renderFile(__dirname + '/template.ejs', function(err, data) { 
    console.log(err || data) 
}) 

source

+2

यह उत्तर कई बार उठाया जाना चाहिए। सही फ़ंक्शन का उपयोग करने वाले अन्य लोगों की तुलना में बहुत आसान है। – Wtower

1

@ksloan का जवाब स्वीकार किए जाते हैं एक होना चाहिए। यह इस उद्देश्य के लिए ईजेएस फ़ंक्शन का उपयोग करता है।

यहाँ कैसे Bluebird के साथ उपयोग करने के लिए का एक उदाहरण है:

var Promise = require('bluebird'); 
var path = require('path'); 
var ejs = Promise.promisifyAll(require('ejs')); 

ejs.renderFileAsync(path.join(__dirname, 'template.ejs'), {context: 'my context'}) 
    .then(function (tpl) { 
    console.log(tpl); 
    }) 
    .catch(function (error) { 
    console.log(error); 
    }); 

पूर्णता के लिए के लिए यहां वर्तमान में स्वीकार जवाब की एक promisified संस्करण है:

var ejs = require('ejs'); 
var Promise = require('bluebird'); 
var fs = Promise.promisifyAll(require('fs')); 
var path = require('path'); 

fs.readFileAsync(path.join(__dirname, 'template.ejs'), 'utf-8') 
    .then(function (tpl) { 
    console.log(ejs.render(tpl, {context: 'my context'})); 
    }) 
    .catch(function (error) { 
    console.log(error); 
    }); 
0

@ksloan ' जवाब वास्तव में अच्छा है। मेरे पास भी वही उपयोग मामला था और खुदाई करने के लिए थोड़ा सा किया। फ़ंक्शन रेंडरफाइल() ओवरलोड हो गया है। एक आप ज्यादातर आवश्यकता होगी:

renderFile(path: string,data, cb) 
उदाहरण के लिए

:

ejs.renderFile(__dirname + '/template.ejs', dataForTemplate, function(err, data) { 
console.log(err || data) 
}) 

जहां dataForTemplate मान टेम्पलेट के अंदर की जरूरत युक्त एक वस्तु है।