2016-04-21 48 views
2

我控制器Expressjs静态文件不工作

exports.index = function(req, res){ 
    var info = {title: 'Index'}; 
    res.render('index' , info); 
}; 

exports.about = function(req, res){ 
    var info = {title: 'about'}; 
    res.render('about' , info); 
}; 

exports.post = function(req, res){ 
    var info = {title: 'Post'}; 
    res.render('post' , info); 
}; 

我的路线。

var controller = require('../controllers/controller'); 
var router = require('express').Router(); 

router.route('/').get(controller.index) 
router.route('/posts/:slug').get(controller.post) 
router.route('/about').get(controller.about); 

module.exports = router; 

Server.js

var express = require('express'); 
var bodyParser = require('body-parser'); 
var exphbs = require('express-handlebars'); 
var router = require(__dirname + '/routes/router'); 

var app = express(); 

app.set('views', __dirname + '/views'); 

app.engine('handlebars', exphbs({defaultLayout: 'main'})); 
app.set('view engine', 'handlebars'); 

app.use(bodyParser.urlencoded({ 
    extended: true 
})); 

app.use(bodyParser.json()); 

var port = process.env.PORT || 8090; 

app.use('/', router); 

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

app.listen(port); 

问题

当我到http://localhost:8090/http://localhost:8090/about我的静态文件。

但是,如果我访问的任何帖子例如http://localhost:8090/posts/lorem-ipsum我在浏览器控制台中得到GET error

+0

既然你没有指定安装点,你的静态文件服务于根'/',并且您的请求用于每个页面的相对路径,即'http:// localhost:8090/posts /',将相对路径更改为静态文件的根相对路径'/ css/style。 css'而不是'css/style.css' – marzelin

+0

我有点困惑。如果你正在提供静态文件,它们将不会被视图引擎渲染,你的路由处理程序也不会被调用。我错过了什么吗? –

+0

@marzelin你想发布这个答案吗?自那以后解决了。谢谢! – Paran0a

回答

0

(从路径http://localhost:8090/posts/css/style.css试图服务器文件),您必须先提供静态文件,然后你的路由,只需切换线是这样的:

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

我很确定(?)在这种情况下定位并不重要,因为我试着从文件的开头到结尾处移动该代码,但它仍然无效。 – Paran0a

+0

对于我这样做的工作......但我只是看到你的路线可能会尝试重命名你的资产,因为你的文件和你的路线之间有一些冲突。在公共下,如果你有一个文件夹发布它将与您的路线/ posts /冲突:slug你可以尝试css/posts吗?看看它是否更好 – jaumard

+0

顺序绝对重要,我读了一篇文章,所有路由处理程序(包括静态文件处理程序)都存储在同一个全局数组中,并且它们由数组中的顺序来解析。 –