2015-01-03 43 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