所以我为我的应用程序实现了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)
)
答案 0 :(得分:0)
我很抱歉,但没有真正的“问题”,这是我身边的误解....
事实上,中间件已全部配置并正常工作。
问题是我的视图中有一个“/images/logo.png”,但我的静态文件夹中没有logo.png ...因此节点正确进入404中间件功能:)
很抱歉这个问题混乱了。