2016-06-24 3 views
-1

bin/www 파일과 app.js 파일과 함께 express-generator로 생성 된 앱이 있습니다. app.js에서 다음을 추가했습니다.노드/익스프레스 4 미들웨어가 작동하지 않습니다

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

하지만 미들웨어를 전혀 호출하지 않습니다. 응용 프로그램의 나머지 부분은 잘 작동하며 서버가 실행 중이고 요청을 수신하고 있음을 확인했습니다. 익스프레스 미들웨어에 대해 알고 노선

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'); 

// 많은 경로

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

을 참조하십시오. 나는 잘하지 않고도 시도했습니다. (.. 앞에서 잘못을 범하지 않고도 시도했습니다.) 나는 그것을 더 분명하게해야한다. – Mankind1023

+0

서버가 실행 중입니까? 요청하는 중입니까? 'app.get ('/', ...)'가 작동하지 않는다면 서버가 제대로 실행되고 있지 않거나 제대로 초기화되지 않은 것입니다. 두 번째 코드 블록이 정확하고 다른 일이 올바르게 수행되면 작동합니다. 따라서 두 번째 코드 블록이 작동하지 않는다면 공개하지 않은 코드에 다른 오류가 있습니다. 우리는 나머지 코드가 무엇이 잘못된지 알아야합니다. – jfriend00

답변

3

중요한 것은의

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.js입니다 그것은 선언의 순서로 호출된다는 것입니다.

선언 된 미들웨어 중 하나가 요청을 처리하면 (응답을 보내서) 요청을 처리 한 후에 선언 된 미들웨어로 요청이 전달되지 않습니다.

다른 모든 미들웨어가 선언 된 후에 "catch-all"미들웨어를 추가하면 다른 곳에서 처리 되었기 때문에 요청이 미들웨어로 전달되지 않을 가능성이 있습니다.

이 문제를 해결하려면 미들웨어 체인에서 "상향"어딘가에 미들웨어를 선언하십시오. 귀하의 경우, 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

관련 문제