2015-01-03 44 views
1

我無法設置我的應用程序的中間件,以便它爲我的一些靜態文件(如css和js)提供服務。我希望能夠在我的index.html中包含位於公共目錄內的我的css和js文件。設置express以啓用靜態css和js文件

This is a picture of my current file structure.

這是我的Express服務器的代碼。

server.js

var express = require('express'); 
var path = require('path'); 
var app = express(); 

//config 
app.set('views', __dirname + ''); 
app.engine('html', require('ejs').renderFile); 
//app.use(express.static(__dirname + '/')); worked when everything was in jqtest 

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

//routes 
app.get('',function(req,res){ 
    res.render('../public/views/index.html') 
}); 

app.env 
//server 
app.listen(process.env.PORT || 5000); 
console.log('app live in 5000'); 

這些都是我想在我的index.html使用SRC標籤,但不工作。我知道我可能需要爲位於組件中的jquery文件另外設置一個app.use。

的index.html

<link rel="stylesheet" type="text/css" href="/public/css/style.css"/> 
<script type="text/javascript" src="/components/jQuery/dist/jquery.js"></script> 
<script type="text/javascript" src="/public/js/myJS.js"></script> 

編輯1 我已經作出了github上這個PROJ公衆。它可以Here

編輯2

這已經回答了。非常感謝teleaziz7zark7幫助指導我完成此過程。

解決方案:

第1步:

所以根主任外刪除你的應用服務器代碼時,問題在於__dirname不是一個全局變量。爲我的靜態文件設置路由的第一步是告訴我的服務器什麼時候是新的根目錄。我加入這行代碼由teleaziz提供這樣做

var root = path.normalize(__dirname + '/..'); 

第2步:

一旦我這樣做,我不得不改變路線供市民使用root,而不是__dir通過teleaziz的建議

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

第3步:

一旦完成我按照teleaziz和7zark7的建議從我的index.html中的src中刪除/ public /。我的新的src標籤工作看起來像這樣。

<link rel="stylesheet" type="text/css" href="/css/style.css"/> 
<script type="text/javascript" src="/components/jQuery/dist/jquery.js"></script> 
<script type="text/javascript" src="/js/myJS.js"></script> 

回答

1

__dirname不是一個全局對象,(即使在文檔正在被混淆讀者全局對象名單!)。它實際上僅限於模塊範圍,並且始終指向包含該模塊的文件夾。這是你的情況是不是你的項目的根服務器文件夾,

所以看你的文件結構允許:

  • 首先要求該路徑模塊,以幫助恢復正常的路徑:

    var path = require('path'); 
    var root = path.normalize(__dirname + '/..'); 
    
  • 您__dirname的用途改變爲根:

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

嘿,謝謝你的建議。我已經實施了上面提供的更改。不幸的是,我的應用程序仍然無法在公共目錄中獲得我的css和js文件。[這裏是包含您所做更改的新server.js的鏈接](http://pastebin.com/nrz51Ri2)。我保持src標籤與上面列出的一樣。感謝您的時間 - 弗雷德 – tilted

+0

思考它,其實第一個答案應該工作, 也許我錯過了一些東西: 如果你在jqtest/server/server.js,你想訪問jqtest/public /然後'path.normalize(__ dirname +'/ ..')'應該可以工作 – teleaziz

+0

嘿,我剛剛試過你編輯的答案。這也是不成功的。如果您想克隆,我已將我的git hub資源庫公開。 [這是一個鏈接到存儲庫。](https://github.com/fredk212/jqtest)謝謝你的一切,-Fredk – tilted

0

刪除這些public

<link rel="stylesheet" type="text/css" href="/css/style.css"/> 
<script type="text/javascript" src="/js/myJS.js"></script> 

正如映射這樣的:

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

你不需要public

+0

嘿,謝謝你的建議。我嘗試過,因爲這是我對它應該如何工作的理解。但事實並非如此。 [這裏是js文件](http://pastebin.com/WkqxVL5C)和[這裏是html文件](http://pastebin.com/sK0ZALET),並在其中實施更改。它仍然沒有正確的路由。 – tilted

+0

你是對的,但我仍然需要設置根文件夾,因爲正如teleaziz所述,__dirname不是全局的,並且由於我將我的服務器代碼移到了根之外,所以不確定根在哪裏。非常感謝。 -FredK – tilted

+1

我明白了,這是因爲你的server.js位於/ server /下,我通常把它放在頂層,並且作爲子目錄具有/ public – 7zark7