From 41f8e6a285fb529ff5a2bd30bd3c3d1794e16036 Mon Sep 17 00:00:00 2001 From: Junyi Date: Fri, 9 Dec 2022 18:15:42 -0800 Subject: [PATCH] fix(plugin-file-manager): fix local serve middleware (#1226) --- packages/core/client/src/locale/zh_CN.ts | 2 +- .../file-manager/src/server/storages/local.ts | 31 ++++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/core/client/src/locale/zh_CN.ts b/packages/core/client/src/locale/zh_CN.ts index 7a5169cad..4de63ef07 100644 --- a/packages/core/client/src/locale/zh_CN.ts +++ b/packages/core/client/src/locale/zh_CN.ts @@ -533,7 +533,7 @@ export default { 'Add storage': '添加文件存储', 'Edit storage': '编辑文件存储', 'Storage base URL': 'Base URL', - 'Destination': '存储路径(绝对)', + 'Destination': '存储路径', 'Use the built-in static file server': '使用内置静态文件服务', 'Local storage': '本地存储', 'Aliyun OSS': '阿里云 OSS', diff --git a/packages/plugins/file-manager/src/server/storages/local.ts b/packages/plugins/file-manager/src/server/storages/local.ts index f934f4bae..8ba16e7be 100644 --- a/packages/plugins/file-manager/src/server/storages/local.ts +++ b/packages/plugins/file-manager/src/server/storages/local.ts @@ -3,6 +3,7 @@ import serve from 'koa-static'; import mkdirp from 'mkdirp'; import multer from 'multer'; import path from 'path'; +import { Transactionable } from 'sequelize/types'; import { URL } from 'url'; import { STORAGE_TYPE_LOCAL } from '../constants'; import { getFilename } from '../utils'; @@ -21,13 +22,14 @@ function match(basePath: string, pathname: string): boolean { return newPath[0] === '/'; } -async function update(app: Application, storages) { +async function refresh(app: Application, storages, options?: Transactionable) { const Storage = app.db.getCollection('storages'); const items = await Storage.repository.find({ filter: { type: STORAGE_TYPE_LOCAL, }, + transaction: options?.transaction }); const primaryKey = Storage.model.primaryKeyAttribute; @@ -39,9 +41,9 @@ async function update(app: Application, storages) { } function createLocalServerUpdateHook(app, storages) { - return async function (row) { + return async function (row, options) { if (row.get('type') === STORAGE_TYPE_LOCAL) { - await update(app, storages); + await refresh(app, storages, options); } }; } @@ -52,19 +54,16 @@ function getDocumentRoot(storage): string { return path.resolve(path.isAbsolute(documentRoot) ? documentRoot : path.join(process.cwd(), documentRoot)); } -async function middleware(app: Application, options?) { - const LOCALHOST = `http://localhost:${process.env.APP_PORT || '13000'}`; - +async function middleware(app: Application) { const Storage = app.db.getCollection('storages'); const storages = new Map(); const localServerUpdateHook = createLocalServerUpdateHook(app, storages); - Storage.model.addHook('afterCreate', localServerUpdateHook); - Storage.model.addHook('afterUpdate', localServerUpdateHook); + Storage.model.addHook('afterSave', localServerUpdateHook); Storage.model.addHook('afterDestroy', localServerUpdateHook); app.on('beforeStart', async () => { - await update(app, storages); + await refresh(app, storages); }); app.use(async function (ctx, next) { @@ -92,13 +91,15 @@ async function middleware(app: Application, options?) { continue; } - return serve(getDocumentRoot(storage), { - // for handle files after any api handlers - defer: true, - })(ctx, async () => { - if (ctx.path.startsWith(basePath)) { - ctx.path = ctx.path.replace(basePath, ''); + ctx.path = ctx.path.replace(basePath, ''); + + const documentRoot = getDocumentRoot(storage); + + return serve(documentRoot)(ctx, async () => { + if (ctx.status == 404) { + return; } + await next(); }); }