2013-05-12 30 views
0

用於測試目的無用中間件:Express.js控制檯中未定義的內容來自何處?

module.exports = function() { 
    return function rankick(req, res, next) { 
     if (Math.random() < 0.5) { 
      return next('Random kick...'); 
     } 

     next(); 
    }; 
}; 

注入簡單明確的應用程序:

var express = require('express'), 
    http = require('http'), 
    path = require('path') 
    rankick= require('./rankick'), 
    util = require('util'); 

var app = express(); 

app.set('port', process.env.PORT || 8080); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(rankick()); // Using the middleware 

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

app.use(function (req, res, next) { 
    res.end('Hello World!'); 
}); 

http.createServer(app).listen(app.get('port')); 

next()被調用,有錯誤字符串,控制檯日誌undefined其次500錯誤:

undefined 
GET/500 28ms 
GET/200 4ms 
undefined 
GET/500 5ms 
+0

'require('path')'位很愚蠢。它僅用於'__dirname'行之一。可能沒有必要,因爲它所做的只是添加一個'/'或'\',這取決於你的操作系統,這在生產中不會改變。只是我的2c – 2013-05-13 06:47:48

回答

-1

您應該做

module.exports = function rankick(req, res, next) { 
    if (Math.random() < 0.5) { 
     console.log('Random kick...'); 
    } 
    else 
     next(); 
}; 

不要使用return來傳遞函數。 module.exports是調用require時傳遞的對象。

另外next()應該被調用,如果你想繼續處理下一個中間件。如果你想停止處理/踢出請求,請不要撥打next()

+0

利用favicon中間件http://www.senchalabs.org/connect/favicon.html'next(err)'被使用。 – gremo 2013-05-12 11:42:18

+0

'next(err)'是錯誤處理,你將錯誤傳給下一個中間件。如果你只是隨機踢他們,那麼不需要那個。 – user568109 2013-05-12 13:38:11

1

這是errorHandler middleware中的這條線。也許它期望得到一個新的錯誤('隨機踢..')?

這是一段時間,因爲我用默認errorHandler所以我不是100%確定。如果它不是downvote,我會刪除這個答案。