2016-06-24 104 views
-1

我有一個應用程序生成與快速發生器,與bin/www文件和app.js文件。在app.js中,我添加了以下內容:節點/ Express 4中間件不工作

app.use(function(req, res, next){ 
     console.log("--------new middleware"); 
     next(); 
    }); 

但它根本不調用中間件。應用程序的其餘部分工作正常,我已確認服務器正在運行並接收請求。

這裏是app.js:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var session = require('express-session'); 
var passport = require('passport'); 


var routes = require('./routes/index'); 
var users = require('./routes/users'); 

//很多航線

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'hbs'); 

app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(session({ secret: 'separation anxiety' })); 
app.use(passport.initialize()); 
app.use(passport.session()); 

app.use('/', routes); 
app.use('/users', users); 

//很多路徑

app.use(function(req, res, next){ 
    console.log("--------new middleware"); 
    next(); 
}); 

// app.use(auth.isLoggedIn); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
    message: err.message, 
    error: {} 
    }); 
}); 

module.exports = app; 
+0

您的中間件功能簽名錯誤。沒有'err'參數。請參閱http://expressjs.com/en/4x/api.html#app.use – jfriend00

+0

根據我上面的帖子,我試了一下也沒有(..我也試過這沒有err在前面)。我應該更清楚。 – Mankind1023

+0

您的服務器是否正在運行?你有沒有收到任何要求?如果'app.get('/',...)'甚至不起作用,那麼你的服務器可能沒有運行或者沒有正確的初始化。你的第二個代碼塊是正確的,並且如果其他事情正確完成,它將工作。所以,如果第二個代碼塊不起作用,那麼您的代碼中還有其他錯誤,您還沒有透露。我們將不得不看你的代碼的其餘部分,以知道還有什麼錯誤。 – jfriend00

回答

3

一個重要的事情瞭解快遞中間件它是按照聲明的順序調用的。

如果任何聲明的中間件處理請求(通過發回響應),則請求不會傳遞到處理請求的中間件之後聲明的任何中間件。

因此,如果在聲明瞭所有其他中間件之後添加了「全能」中間件,那麼很可能沒有請求會傳遞到您的中間件,因爲它在別處處理過。

要解決此問題,請在中間件鏈中的某處「高位」聲明您的中間件。在你的情況下,嘗試express.static前宣佈它:

app.use(function(req, res, next){ 
    console.log("--------new middleware"); 
    next(); 
}); 
app.use(express.static(path.join(__dirname, 'public'))); 

這將取決於你的中間件在中間件​​鏈中的正確位置會是怎樣的終極目標。

或者,由於您在404處理程序正上方添加了中間件,因此請嘗試從服務器請求不存在的URL;這也應該會觸發你的中間件。

+0

因此,請求不存在的URL確實會觸發它,任何方式使這個運行在每個電話或至少每條路線? – Mankind1023

+0

@ Mankind1023是的,將它移到聲明路線的上方。 – robertklep

+0

好的,所以把這個放在文件的頂部似乎是訣竅,謝謝! – Mankind1023