2017-09-29 47 views
0

我有這樣的明確的js代碼在我server.js文件:快遞JS,添加「/」結尾的所有網址

var express = require('express'); 

var app = express(); 
var fs = require('fs'); 
var publicdir = __dirname + '/client'; 

app.set('port', 8080); 

app.use(function(req, res, next) { 
    if (req.path.indexOf('/js/') === -1 && req.path.indexOf('/css/') === -1) { 
     if (req.path.substr(-1) === '/') { 
      req.url = req.url.slice(0, -1) + '.html'; 
     } else { 
      res.redirect(301, req.url + '/'); 
     } 
    } 
    next(); 
}); 

app.use(express.static(publicdir, { 
    extensions: ['html', 'htm'] 
})); 

我試圖讓網址一致渲染始終有一個尾隨「 /「在每個URL的末尾。雖然上面的代碼工作,我一直在我的日誌文件中收到錯誤消息說:

Error: Can't set headers after they are sent.

這個錯誤來自這樣的URL模式:

http://www.myserver.com/my-page-name

但它確實正確添加尾隨「/」結束。

如何更改上述代碼以消除該日誌錯誤?

回答

2

在您致電res.redirect()之後,請勿撥打next(),因爲這將允許您的其他路由處理程序處理導致您看到的錯誤消息的URL,因爲兩個路由處理程序都嘗試發送響應。

更改中間件處理程序代碼到這(留下你的代碼的其餘部分是):

app.use(function(req, res, next) { 
    if (req.path.indexOf('/js/') === -1 && req.path.indexOf('/css/') === -1) { 
     if (req.path.substr(-1) === '/') { 
      req.url = req.url.slice(0, -1) + '.html'; 
     } else { 
      // redirect to add the slash, do not continue routing 
      res.redirect(301, req.url + '/'); 
      return;  // returning here will skip the call to next() below 
          // so there will be no additional routing 
     } 
    } 
    // continue routing if we get here 
    next(); 
}); 

的想法是,你要調用在不發出res.redirect()所有代碼路徑next(),但不在任何代碼路徑中。

+0

啊哈!這是關鍵。我將'next()'改爲'done()',而不是正常工作,沒有日誌錯誤!謝謝! – tonejac

+0

@tonejac - 我不知道你從哪裏得到了一個'done()',但我很高興它現在已經修復。 – jfriend00

+0

當我刪除下一個()調用剛剛掛起的服務器並不會提供頁面。添加完成()做了訣竅。謝謝你的提示。 – tonejac

相關問題