2012-05-10 71 views
1

我有一個node.js應用程序,當我嘗試加載主頁時,我卡住了一個錯誤消息。我會盡我所能在下面佈置我的架構。它是index.js - > server.js - > router.js - > requestHandlers.js使用express來設置一個基本的服務器

我使用express(www.expressjs.com)和nodebeginner.org的組合。對不起,很長的問題..只是想盡可能多地獲取信息。

index.js(創建一個包含路徑/ requesthandler信息處理對象,調用函數來啓動服務器),我開始router.route這裏並將其傳遞的每一步

var server = require("./server"); 
var router = require('./router'); 
var requestHandlers = require('./requestHandlers'); 

// Routes 

var handle = {} 
handle['/'] = requestHandlers.home; 

server.start(router.route, handle) 

server.js(啓動服務器,這是我要配置的服務器,獲取從一個URL的路徑名,並將其傳遞到路由模塊)

var http = require("http"); 
var url = require('url'); 
var express = require('express'); 

function start (route, handle) { 
    var onRequest = function(request, res) { 
     var pathname = url.parse(request.url).pathname; 
     console.log("request for " + pathname + " recieved."); 
     route(handle, pathname, res); 
    } 

    var app = express.createServer(onRequest).listen(8888); 
    if (app.configure) { 
     console.log('app exists'); //logging correctly 
    } 
    // Configuration 
    app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.configure('production', function(){ 
    app.use(express.errorHandler()); 
}); 

    console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); //logs correct with 8888 and development 
} 

exports.start = start; 

router.js(從索引傳遞的函數路線 - >服務器它調用router.js中的路由功能,調用requestHandle該路徑名在手柄對象匹配R)

function route (handle, pathname, res) { 

    console.log("About to route a request for" + pathname); //About to route a request for/stylesheets/style.css SEE BELOW******* this is the error 

if (typeof handle[pathname] === 'function') { 
     handle[pathname] (res); 
    } 
    else { 
     console.log('no request handler found for' + pathname); 
    } 
} 

exports.route = route; 

requestHandler.js(與RES/REQ對象進行交互,函數被映射到特定的路徑名​​,僅當這些路徑名請求由於路由器)

稱爲
var home = function(res){ 
    res.render('index', { title: 'WWYB?' }); 
    console.log('homepage rendered'); //correctly logs for pathname = '/' 
    //click(); 
}; 

exports.home = home; 

** *當我去請求本地主機:8888它試圖做出一堆請求。首先它會正確地請求「/」,但是會繼續記錄所有說「關於爲/ stylesheets/style.css發送請求」的所有內容。最終,頁面將不加載css。我的layout.jade文件中指出的路徑名正是'/stylesheets/style.css'。

爲什麼路徑名曾經評估爲/stylesheets/style.css?我認爲節點在後臺執行某些操作,但我沒有完全理解它。

讓我知道你是否需要更多信息。謝謝!

回答

5

像@TJHolowaychuk評論你真的應該檢查手冊,並遵循了一堆教程。無論如何,我會盡力幫你一下。

這是一個非常基本的解釋。 Express允許您使用子應用程序,因此您可以在不同的文件中擁有不同部分的應用程序。它也有自己的路由器。如果您在處理路由之前需要處理請求和/或響應,您可以創建一箇中間件。如果你想在不同的模塊中進行配置,那麼返回一個函數。

所以server.js的例子:

var $express = require('express'), 
      app = module.exports = $express.createServer(), 
     subapp = require('./subapp'), 
    configure = require('./configure'); 

// Each of our own configure returns a function that will be 
// called by app.configure 
app.configure(configure.all(app)); 
app.configure('development', configure.devel(app)); 
app.configure('production', configure.prod(app)); 

// Use our sub application 
app.use(subapp); 

// Now listen 
app.listen(3030) 

subapp.js:

var $express = require('express'), 
    subapp = module.exports = $express.createServer(); 

// Add a handler for GET/to our sub-application 
subapp.get('/', function (req, res) { 
    res.end('Hello world!'); 
}); 

最後配置。JS:

var $express = require('express'); 

exports.all = function (app) { 
    return function() { 
     // Global configurations 

     app.use($express.bodyParser()); 
     app.use($express.methodOverride()); 
     app.set('views', __dirname + '/views'); 
     app.set('view engine', 'jade'); 
     app.use($express.static(__dirname + '/public')); 
     //... 

     // If you want to do something with/on the request/response 
     // you can create a middleware 
     app.use(function (req, res, next) { 
     console.log('caught request %s %s', req.method, req.path); 

     // Don't forget the callback 
     next(); 
     }); 
    }; 
}; 

exports.devel = function (app) { 
    return function() { 
     // Development configurations 
    }; 
}; 

//... 

轉到localhost:3030用你喜歡的瀏覽器,它顯示 「Hello World!」,這是我們的請求處理。如果你看看終端,你會看到「GET GET /」,這是我們的中間件。

您的樣式表,客戶端JavaScript等應該在/ public中。 app.use(express.static(__dirname + '/public'))將提供這些服務。

比方說,你有/public/stylesheets/all.css,然後在玉模板可以包括像這樣link(rel='stylesheet', href='/public/stylesheets/all.css')

現在,你必須嘗試和了解更多的節點,並表示甚至想到的東西部署到生產環境之前,這些網站可以幫助你:

希望這個微小的嘖嘖可以幫助你。

+0

謝謝你kevin。我試着將你的配置分成獨立的模塊,就像你所建議的那樣,但我仍然遇到同樣的問題。我會檢查這些鏈接。謝謝! –

+0

爲什麼在代碼中使用'$ express'變量名稱而不是'express'? – Erik

+0

這只是一個避免名稱衝突的慣例。假設你想使用路徑模塊,使用這個約定,你可以創建一個帶有路徑參數的函數,沒有歧義。它還使依賴變量快速識別和區別。有些人使用所有大小寫,但我認爲這是一個壞主意,我們通常將它用於常量值,而模塊不是常量。另外,許多前端框架使用美元符號作爲全局名稱空間,所以美元前綴對我來說感覺非常一致。 – kevin

4

哇,這是非常令人困惑,你可能要開始與應用快遞(1)可以爲您生成

+0

你是什麼意思? –

+0

他可能的意思是'./node_modules/express/bin/express --help'。 – elmigranto

+0

它試圖將所有我的樣式和圖像鏈接到我的玉文件 –