fix(plugin-file-manager): fix local serve middleware (#1226)

This commit is contained in:
Junyi 2022-12-09 18:15:42 -08:00 committed by GitHub
parent 0480b57db5
commit 41f8e6a285
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 16 deletions

View File

@ -533,7 +533,7 @@ export default {
'Add storage': '添加文件存储', 'Add storage': '添加文件存储',
'Edit storage': '编辑文件存储', 'Edit storage': '编辑文件存储',
'Storage base URL': 'Base URL', 'Storage base URL': 'Base URL',
'Destination': '存储路径(绝对)', 'Destination': '存储路径',
'Use the built-in static file server': '使用内置静态文件服务', 'Use the built-in static file server': '使用内置静态文件服务',
'Local storage': '本地存储', 'Local storage': '本地存储',
'Aliyun OSS': '阿里云 OSS', 'Aliyun OSS': '阿里云 OSS',

View File

@ -3,6 +3,7 @@ import serve from 'koa-static';
import mkdirp from 'mkdirp'; import mkdirp from 'mkdirp';
import multer from 'multer'; import multer from 'multer';
import path from 'path'; import path from 'path';
import { Transactionable } from 'sequelize/types';
import { URL } from 'url'; import { URL } from 'url';
import { STORAGE_TYPE_LOCAL } from '../constants'; import { STORAGE_TYPE_LOCAL } from '../constants';
import { getFilename } from '../utils'; import { getFilename } from '../utils';
@ -21,13 +22,14 @@ function match(basePath: string, pathname: string): boolean {
return newPath[0] === '/'; return newPath[0] === '/';
} }
async function update(app: Application, storages) { async function refresh(app: Application, storages, options?: Transactionable) {
const Storage = app.db.getCollection('storages'); const Storage = app.db.getCollection('storages');
const items = await Storage.repository.find({ const items = await Storage.repository.find({
filter: { filter: {
type: STORAGE_TYPE_LOCAL, type: STORAGE_TYPE_LOCAL,
}, },
transaction: options?.transaction
}); });
const primaryKey = Storage.model.primaryKeyAttribute; const primaryKey = Storage.model.primaryKeyAttribute;
@ -39,9 +41,9 @@ async function update(app: Application, storages) {
} }
function createLocalServerUpdateHook(app, storages) { function createLocalServerUpdateHook(app, storages) {
return async function (row) { return async function (row, options) {
if (row.get('type') === STORAGE_TYPE_LOCAL) { 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)); return path.resolve(path.isAbsolute(documentRoot) ? documentRoot : path.join(process.cwd(), documentRoot));
} }
async function middleware(app: Application, options?) { async function middleware(app: Application) {
const LOCALHOST = `http://localhost:${process.env.APP_PORT || '13000'}`;
const Storage = app.db.getCollection('storages'); const Storage = app.db.getCollection('storages');
const storages = new Map<string, any>(); const storages = new Map<string, any>();
const localServerUpdateHook = createLocalServerUpdateHook(app, storages); const localServerUpdateHook = createLocalServerUpdateHook(app, storages);
Storage.model.addHook('afterCreate', localServerUpdateHook); Storage.model.addHook('afterSave', localServerUpdateHook);
Storage.model.addHook('afterUpdate', localServerUpdateHook);
Storage.model.addHook('afterDestroy', localServerUpdateHook); Storage.model.addHook('afterDestroy', localServerUpdateHook);
app.on('beforeStart', async () => { app.on('beforeStart', async () => {
await update(app, storages); await refresh(app, storages);
}); });
app.use(async function (ctx, next) { app.use(async function (ctx, next) {
@ -92,13 +91,15 @@ async function middleware(app: Application, options?) {
continue; continue;
} }
return serve(getDocumentRoot(storage), { ctx.path = ctx.path.replace(basePath, '');
// for handle files after any api handlers
defer: true, const documentRoot = getDocumentRoot(storage);
})(ctx, async () => {
if (ctx.path.startsWith(basePath)) { return serve(documentRoot)(ctx, async () => {
ctx.path = ctx.path.replace(basePath, ''); if (ctx.status == 404) {
return;
} }
await next(); await next();
}); });
} }