多次调用 Express 中间件
Express middleware calls multiple times
我检查了与此主题相关的其他帖子,但在我的代码中找不到问题。
const myMiddleware = (fn) => {
return (req, res, next) => {
var fullUrl = req.protocol + '://' + req.get('host') + req.url;
console.log(fullUrl)
next()
}
}
const app = express()
app.use('/dist', express.static(__dirname + '/client/dist'))
app.use('/static', express.static(__dirname + '/client/static'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(cookieParserMiddleware())
app.use(passport.initialize())
const server = https.createServer(options, app)
app.get('/', myMiddleware((req, res) => {
res.sendFile(__dirname + '/client/dist/index.html')
}))
app.all('*', (req, res) => {
res.redirect('/')
})
server.listen(8080, function listening() {
console.log('Listening on %d', server.address().port)
})
如果 '/'
路径上没有 myMiddleware
,一切都会按预期进行。将 myMiddleware
附加为 app.get('/', myMiddleware((req, res) => {
然后 myMiddleware
被多次调用而 res.sendFile(__dirname + '/client/dist/index.html')
被调用。
编辑:下面的错误已通过 jfriend00 的解决方案修复。多次调用的中间件仍然存在。原因是 favicon 和一些其他资产没有被 app.use('/static', express.static(__dirname + '/client/static'))
行捕获。修复路径也解决了第一个错误
除了这个问题之外,我尝试删除下面的部分,但应用程序根本无法运行。我猜这里有 2 个错误。
app.all('*', (req, res) => {
res.redirect('/')
})
我已经发布了一张图片,说明删除后的效果 app.all('*'..)
这里我来猜一猜
改变这个:
app.get('/', myMiddleware((req, res) => {
res.sendFile(__dirname + '/client/dist/index.html')
}));
对此:
app.get('/', myMiddleware(), (req, res) => {
res.sendFile(__dirname + '/client/dist/index.html')
}));
这样您的 res.sendFile()
实际上会在 myMiddleware
调用 next()
之后被调用。
然后,删除 fn
参数,这样你就有了这个(不改变执行,但删除误导性和未使用的参数):
const myMiddleware = () => {
return (req, res, next) => {
var fullUrl = req.protocol + '://' + req.get('host') + req.url;
console.log(fullUrl)
next()
}
}
我检查了与此主题相关的其他帖子,但在我的代码中找不到问题。
const myMiddleware = (fn) => {
return (req, res, next) => {
var fullUrl = req.protocol + '://' + req.get('host') + req.url;
console.log(fullUrl)
next()
}
}
const app = express()
app.use('/dist', express.static(__dirname + '/client/dist'))
app.use('/static', express.static(__dirname + '/client/static'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(cookieParserMiddleware())
app.use(passport.initialize())
const server = https.createServer(options, app)
app.get('/', myMiddleware((req, res) => {
res.sendFile(__dirname + '/client/dist/index.html')
}))
app.all('*', (req, res) => {
res.redirect('/')
})
server.listen(8080, function listening() {
console.log('Listening on %d', server.address().port)
})
如果 '/'
路径上没有 myMiddleware
,一切都会按预期进行。将 myMiddleware
附加为 app.get('/', myMiddleware((req, res) => {
然后 myMiddleware
被多次调用而 res.sendFile(__dirname + '/client/dist/index.html')
被调用。
编辑:下面的错误已通过 jfriend00 的解决方案修复。多次调用的中间件仍然存在。原因是 favicon 和一些其他资产没有被 app.use('/static', express.static(__dirname + '/client/static'))
行捕获。修复路径也解决了第一个错误
除了这个问题之外,我尝试删除下面的部分,但应用程序根本无法运行。我猜这里有 2 个错误。
app.all('*', (req, res) => {
res.redirect('/')
})
我已经发布了一张图片,说明删除后的效果 app.all('*'..)
这里我来猜一猜
改变这个:
app.get('/', myMiddleware((req, res) => {
res.sendFile(__dirname + '/client/dist/index.html')
}));
对此:
app.get('/', myMiddleware(), (req, res) => {
res.sendFile(__dirname + '/client/dist/index.html')
}));
这样您的 res.sendFile()
实际上会在 myMiddleware
调用 next()
之后被调用。
然后,删除 fn
参数,这样你就有了这个(不改变执行,但删除误导性和未使用的参数):
const myMiddleware = () => {
return (req, res, next) => {
var fullUrl = req.protocol + '://' + req.get('host') + req.url;
console.log(fullUrl)
next()
}
}