2012-11-21 43 views
15

我正在嘗試使節點,表達式和ejs作爲模板的簡單服務器。我已經讓服務器指向頁面,加載它,甚至可以用include語句生成其他代碼段。但由於某種原因樣式表不會加載。無法獲取樣式表與ejs一起工作node.js

app.js

var express = require('express'), 
app = express(), 
http = require('http'), 
server = http.createServer(app), 
fs = require('fs'); 

var PORT = 8080; 

app.set('view engine', 'ejs'); 

app.get('/', function(req, res){ 
res.render('board.ejs', { 
    title: "anything I want", 
    taco: "hello world", 
    something: "foo bar", 
    layout: false 
    }); 
}); 


app.listen(PORT); 
console.log("Server working"); 

的EJS文件是目錄中的意見/ board.ejs

<html> 
<head> 
    <title><%= title %></title> 
    <link rel='stylesheet' href='../styles/style.css' /> 
</head> 
<body > 
    <h1> <%= taco %> </h1> 
    <p> <%= something %> </p> 
</body> 
</html> 

和style.css的是款式/ style.css中相對於應用程序的目錄。 JS

p { 
    color:red; 
} 

我想盡我可以爲鏈接的href,包括相對於在我的localho設想的路徑st相對於app.js相對於board.ejs,甚至只是style.css,但似乎沒有任何工作。任何建議,非常感謝。

回答

37

聲明靜態目錄:

app.use(express.static(__dirname + '/public')); 

<link rel='stylesheet' href='/style.css' /> 
+0

似乎並沒有工作。爲什麼''/ public'?'以及如何設置app.use改變樣式表的評估方式?我也嘗試將設置爲'href ='/ styles/style.css'',並且沒有任何運氣 – Loourr

+0

將它放在app.router()行的上方。 – chovy

+1

你基本上在和你的.ejs文件交談,並說當你引用一個靜態文件時,就像上面的'link'標記一樣,根目錄是你在app.use中定義的'public'文件夾,而不是根你的整個應用程序的目錄。在這種情況下,鏈接標記的href中的「/」引用「public」目錄,而不是應用程序的根目錄。 – mumush

10
在app.js

you must first declare static directory 

app.use("/styles",express.static(__dirname + "/styles")); 

在EJS文件:

<link rel='stylesheet' href='/styles/style.css' /> 
+0

這是非常好的答案!如果您嘗試像我一樣使用一些基於文件位置的相對路徑,例如href ='../../styles/style.css'如果你有一些模板(例如每個文件包含的css/js資源),你將會遇到問題。簡而言之 - 當你使用「/ bla/bla」(斜線/ bla/bla)時,你正在使用靜態目錄。好。 – Combine