2016-04-21 87 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

順序絕對重要,我讀了一篇文章,所有路由處理程序(包括靜態文件處理程序)都存儲在同一個全局數組中,並且它們由數組中的順序來解析。 –