2013-05-22 69 views
2

我試圖通過使用expressj來檢測IE,代碼肯定會將我重定向到錯誤頁面。在expressjs中檢測IE,但無法獲取靜態文件

但問題是它不會呈現css文件並獲取我的文件夾中的圖像文件。

我認爲問題是expressjs重定向到error_page之前設置靜態路徑。

所以我把app.all('*', ieRedirecter);

app.use(express.static(path.join(__dirname, 'public'))); 
app.use(express.static(__dirname + '/uploads')); 

問題後,仍時有發生......可能有人幫助我,謝謝!

我的設置

function ieRedirecter(req, res, next) { 
    if(req.headers['user-agent'].indexOf("MSIE") >= 0) { 
    var myNav = req.headers['user-agent']; 
    var IEbrowser = parseInt(myNav.split('MSIE')[1]) 
    if(IEbrowser < 9) { 
     res.render('error/browser_error', {title : 'not supporting your browser'}) 
    } else { 
     next(); 
    } 
    } else { 
    next(); 
    } 
}; 

app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    ... 
    ... 
    ... 
    app.use(app.router); 

    app.use(express.static(path.join(__dirname, 'public'))); 
    app.use(express.static(__dirname + '/uploads')); 

    app.all('*', ieRedirecter); 
}) 

回答

2

這個命令不起作用:

app.use(app.router); 

app.use(express.static(path.join(__dirname, 'public'))); 
app.use(express.static(__dirname + '/uploads')); 

app.all('*', ieRedirecter); 

app.router是處理所有的路由請求,包括app.all()中間件,即使你聲明後,這條路你其他中間件(有趣的事實是:在任何時候你聲明一條路由 - 使用app.{get,post,all,...} - app.router中間件被自動插入到中間件鏈中)。

如果可能的話,最簡單的解決辦法是你的路由之前的靜態和IE中間件移動到(但我意識到可能會導致您的應用程序安裝問題):

// static middleware first... 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(express.static(__dirname + '/uploads')) 

// ...followed by the IE check 
app.use(ieRedirecter); 

// ...followed by your routes 
app.get('/', ...); 
... 

另一個解決方案是過濾掉通過查看req.path請求ieRedirecter中間件中的靜態資源請求,但假定您可以輕鬆識別這些請求(例如,如果它們以/css/js開頭)。

+0

感謝您的解釋,我已經通過您的回答澄清了一些問題。我剛剛閱讀完答案後才解決了這個問題,再次感謝! – LiJung