快速中间件调用多次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速中间件调用多次相关的知识,希望对你有一定的参考价值。

我已经检查了与此主题相关的其他帖子,但在我的代码中找不到问题。

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('*'..)时的外观的图片

enter image description here

答案

我要在这里猜一猜。

改变这个:

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()
    }
}

以上是关于快速中间件调用多次的主要内容,如果未能解决你的问题,请参考以下文章

对 glDrawElements 的多次调用是不是比在 GLSL 中对每个片段执行相同的计算更有效?

防止同一片段多次堆叠 (addToBackStack)

PassportJS 中间件被多次调用

OnResume / OnPause多次调用

vs2003:快速片段工具

从 Fragment 返回时,Flow onEach/collect 被多次调用