nodejs:对404中间件感到困惑

时间:2015-03-21 19:41:08

标签: node.js express coffeescript http-status-code-404

所以我为我的应用程序实现了404中间件。我最初将它作为最后一条路线,然后遵循建议(特别是Express' FAQ),并使用中间件功能。

但现在我很困惑。我在我的中间件函数中放了一个调试消息,似乎每个请求实际上都在执行该中间件(因为我可以看到输出中每个请求的调试消息,甚至是成功的请求)!这让我很烦,我做错了什么?

这是我的应用代码(注意:coffeescript)。我发布整个文件是因为有时候中间件,路由等可能互相干扰,我发现的例子只显示了404中间件本身。尽管如此,为了简洁起见省略了一些代码:

#Omitted all requires for brevity

#########################################################
# Connect to DB 
#########################################################
loc = process.env.LOCATION || 'local'
db = mongoose.connect(config.db.mongoose_auth_local)

#########################################################
# Initiallize the application
#########################################################
app = module.exports = express()

env = process.env.NODE_ENV || 'development'
if ('development' == env)
  app.use(errorhandler())

app.set('views', __dirname + '/views')
app.set('view engine','jade')
#########################################################
# Initiallize the middleware 
#########################################################
app.use session(
  secret: 'myapp',
  saveUninitialized: false,
  resave: false 
  )

app.use(express.static(__dirname + '/public'))
app.use('/bower_components', express.static(__dirname + '/bower_components'))
app.use(flash())
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true}))
app.use(passport.initialize())
app.use(passport.session())

#########################################################
# Middleware authentication functions 
#########################################################
# Check user is admin
is_admin = (req, res, next) ->
  #check if user is admin, omitted


LocalStrategy = require('passport-local').Strategy
passport.use(new LocalStrategy( (username, password, done) ->
  #passport setup, omitted
)

passport.serializeUser( (user, done) ->
  done(null, user._id)
)

passport.deserializeUser((id,done) ->
  User.findById(id, (err, user) ->
    done(err, user)
  )
)

#########################################################
# Define user routes 
#########################################################
app.get('/', routes.index)
#some more routes, omitted

app.post '/login', (req, res, next) ->
  #login function, omitted

#>>>>>>>>>>>THE 404 MIDDLEWARE function with the debug output <<<<<<<<<<
app.use((req, res, next) ->
  debug("404 middleware")
  err = new Error('Not Found')
  res.status = 404
  res.render('404')
)

app.use( (error, req, res, next) ->
  res.status(500)
  res.render('500')


port = process.env.PORT || config.app.port
info("Configured port for the application is : " + port)

app.listen(port, () ->
  console.log("Express server listening on port %d in %s mode", port, app.settings.env)
  )

1 个答案:

答案 0 :(得分:0)

我很抱歉,但没有真正的“问题”,这是我身边的误解....

事实上,中间件已全部配置并正常工作。

问题是我的视图中有一个“/images/logo.png”,但我的静态文件夹中没有logo.png ...因此节点正确进入404中间件功能:)

很抱歉这个问题混乱了。