2012-03-19 14 views
7

express.js से आ रहा है, मैं flatiron को एक छोटी परियोजना के लिए प्रयास करना चाहता हूं। हालांकि, कुछ छोटी समस्याएं हैं जो मुझे वास्तव में कहीं से मिलने से रोकती हैं।flatiron.js रूटिंग और संघ, निदेशक और प्लेटों के साथ templating?

var flatiron = require('flatiron') 
, session = require('connect').session 
, ecstatic = require('ecstatic') 
, path = require('path') 
, fs = require('fs') 
, plates = require('plates') 
, director = require('director') 
, winston = require('winston') 
, union = require('union'); 

var router = new director.http.Router(); 
var server = union.createServer({ 
    before: [ 
    ecstatic(__dirname + '/public') 
    ] 
}); 

router.get('/', function() { 
    var self = this; 
    fs.readFile('public/layout.html', 'utf-8', function(err, html) { 
    [...] 
    }) 
}); 

server.listen(3000, function() { 
    console.log('Application is now started on port 3000'); 
}); 

निदेशक के साथ रूटिंग कैसे काम करता है? जब मैं ecstatic छोड़ देता हूं, तो मैं '/' जैसे मार्गों को परिभाषित कर सकता हूं और यह काम करता है, लेकिन फिर मुझे स्थिर सीएसएस और जेएस सामग्री नहीं मिलती है। एक्स्टैटिक/'index.html' के साथ प्रतिस्थापित किया गया है और सभी परिभाषित मार्गों पर उत्साही प्राथमिकता है। - कनेक्ट-स्टेटिक के साथ यह वही व्यवहार है। रूट (/) index.html द्वारा प्रतिस्थापित किया गया है।

var flatiron = require('flatiron') 
, connect = require('connect') 
, path = require('path') 
, fs = require('fs') 
, plates = require('plates') 
, app = flatiron.app; 

app.use(flatiron.plugins.http); 
app.use(connect.favicon()); 
app.use(connect.static(__dirname + '/public')); 
app.use(connect.directory(__dirname + '/public')); 
app.use(connect.cookieParser('my secret here')); 
app.use(connect.session({'secret': 'keyboard cat'})); 

app.router.get('/', function() { 
    console.log("GET /"); 
    var self = this; 
    fs.readFile('public/layout.html', 'utf-8', function(err, html) { 
    [...] 
    }) 
}); 

app.listen(3000, function() { 
    console.log('Application is now started on port 3000'); 
}); 

उत्तर

4

मैं Flatiron में मार्ग है, हमेशा की तरह, स्रोत कोड के अंदर के बारे में अपने प्रश्न के लिए सबसे अच्छा जवाब लगता है सभी मिडलवेयर के बाद। यदि आप app.http में 'ecstatic' रखते हैं और इसे वर्कफ़्लो के दौरान प्रेषित किया जाएगा, तो कोई अन्य मिडलवेयर नहीं बुलाया जाएगा।

कोड का आपका दूसरा ब्लॉक दर्शाता है कि आप एक्सप्रेस/कनेक्ट से Flatiron's .use() विधि के बीच अवांछित अंतर नहीं करते हैं। मैं इसे इस उदाहरण पर स्पष्ट कर देने की कोशिश करेंगे:

// Initiating application 
    app.use(flatiron.plugins.http); 

    // Adding request handlers 
    app.http.before.push(connect.favicon()); 
    app.http.before.push(ecstatic(__dirname + '/public')); 
2
var connect = require('connect'); 

var server = union.createServer({ 
    before: [ 
    function (req, res) { 
     var found = router.dispatch(req, res); 
     if (!found) { 
      res.emit('next'); 
     } 
    }, 
    connect.static('public') 
    ] 
}); 

मैं प्रेषण-समारोह डालने के लिए भूल गया:

मैं भी एक अलग दृष्टिकोण कनेक्ट मिडलवेयर, जो काम नहीं करता है उपयोग करने की कोशिश। यह काम।

 app.server = union.createServer({ 
      after: app.http.after, 
      before: app.http.before.concat(function (req, res) { 
      if (!app.router.dispatch(req, res, app.http.onError || union.errorHandler)) { 
       if (!app.http.onError) res.emit('next'); 
      } 
      }), 
      headers: app.http.headers, 
      limit: app.http.limit 
    }); 

आप यहाँ देख सकते हैं Flatiron अंतिम अनुरोध हैंडलर के रूप में रूटर बांधता है, कि कहा जाता है:

+0

धन्यवाद:

flatironApp.use({ // plugin object name : "pluginName" , attach : function(options) { /*code*/ } , init : function(done) { /*code*/ done(); } }) connectApp.use(function(req, res, next) { /* code */ next(); }) 

आप Flatiron में कनेक्ट के मिडलवेयर उपयोग करना चाहते हैं तो आप इस तरह app.http.before सरणी में क्रमश: यह जगह चाहिए इसे समझने के लिए। यह बहुत अजीब और खराब दस्तावेज है! –

+0

इसे पोस्ट करने के लिए धन्यवाद, मैंने connect.static() भाग को याद किया। – Zacho

संबंधित मुद्दे