apache express静态中间件前调用函数

pxyaymoc  于 2023-08-07  发布在  Apache
关注(0)|答案(1)|浏览(134)

我有一个Express静态中间件来服务特定文件夹下的文件,我想在这个中间件之前运行一个函数。
我厌倦了这样的东西:

app.use('/projects', ProjectsRoute.addView, express.static(path.join(__dirname, '/resources/projects')))

字符串
自定义中间件

const addView = async (req, res, next) => {

    if (req.originalUrl.split('/')[3] === 'index.htm') {
        try {
            const folder = req.originalUrl.split('/')[2]
            const project = await models.projects.findOne({ where: { folder } })

            if (project) {
                await models.projects.increment({ views: 1 }, { where: { id: project.id } })
            } else {
                next('Project not found')
            }

        } catch (err) {
            console.log(`Error: ${err}`);
            next(err)
        }
    }
    next()
}


在本地环境中,它工作得很好,函数“addView”在服务文件之前运行,但一旦它在生产环境中,它的工作方式就不同了。
我在文档中读到,文件将首先被提供,只有在找不到文件时才运行我的中间件。
serve-static的文档
这就是生产中正在发生的事情。中间件仅在没有找到作为某种回退的文件时才被调用。
我只想在提供文件夹项目中的文件时运行这个自定义中间件,所以我不想为所有路由创建中间件。

w8f9ii69

w8f9ii691#

我已设法找到解决此问题的方法。
而不是声明与express静态中间件连接的自定义中间件:

app.use('/projects', ProjectsRoute.addView, express.static(path.join(__dirname, '/resources/projects')))

字符串
我把两个分开,就像这样:

app.use('/project', ProjectsRoute.addView)
app.use('/project', express.static(path.join(__dirname, '/resources/projects')))


这看起来工作正常,因为两个都会被调用,但这就是重点。

相关问题