diff --git a/lib/server/start.js b/lib/server/start.js index 555c73c..f59ad0e 100644 --- a/lib/server/start.js +++ b/lib/server/start.js @@ -236,6 +236,10 @@ async function startup(path, connector, omitWatchers, omitTimers, routine) { ctx.set('Access-Control-Allow-Origin', '*'); ctx.set('Access-Control-Allow-Headers', corsHeaders.concat(connector.getCorsHeader())); ctx.set('Access-Control-Allow-Methods', corsMethods); + if (connector.getCorsExposeHeaders) { + const exposeHeaders = connector.getCorsExposeHeaders(); + ctx.set('Access-Control-Expose-Headers', exposeHeaders); + } if (ctx.method == 'OPTIONS') { ctx.body = 200; } @@ -269,12 +273,39 @@ async function startup(path, connector, omitWatchers, omitTimers, routine) { } }); } + const connectorCustomAspects = connector.registerCustomAspect ? connector.registerCustomAspect() : null; router.post(connector.getRouter(), async (ctx) => { const { request } = ctx; - const { contextString, aspectName, data } = connector.parseRequest(request.headers, request.body, request.files); - const { result, opRecords, message } = await appLoader.execAspect(aspectName, request.headers, contextString, data); + const { contextString, aspectName, data } = await connector.parseRequest(request.headers, request.body, request.files); + let result; + let opRecords = []; + let message = undefined; + if (connectorCustomAspects && + connectorCustomAspects.findIndex(a => a.name === aspectName) >= 0) { + // 自定义aspect处理 + console.log(`调用Connector自定义Aspect: ${aspectName}`); + const aspect = connectorCustomAspects.find(a => a.name === aspectName); + const res = await aspect.handler({ + headers: request.headers, + contextString, + params: data, + }); + result = res.result; + opRecords = res.opRecords || []; + message = res.message; + } + else { + const res = await appLoader.execAspect(aspectName, request.headers, contextString, data); + result = res.result; + opRecords = res.opRecords || []; + message = res.message; + } const { body, headers } = await connector.serializeResult(result, opRecords, request.headers, request.body, message); ctx.response.body = body; + // headers 要拼上 + Object.keys(headers || {}).forEach(key => { + ctx.set(key, headers?.[key]); + }); return; }); // 桥接访问外部资源的入口 diff --git a/src/server/start.ts b/src/server/start.ts index 4cb3992..ad1ad64 100644 --- a/src/server/start.ts +++ b/src/server/start.ts @@ -9,7 +9,7 @@ import KoaBody from 'koa-body'; import { AppLoader, getClusterInfo, ClusterAppLoader } from 'oak-backend-base'; import { BackendRuntimeContext } from 'oak-frontend-base/lib/context/BackendRuntimeContext'; -import { OakException, Connector, EntityDict, ClusterInfo } from 'oak-domain/lib/types'; +import { OakException, Connector, EntityDict, ClusterInfo, OpRecord } from 'oak-domain/lib/types'; import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain'; import { AsyncRowStore, AsyncContext } from 'oak-domain/lib/store/AsyncRowStore'; import { SyncContext } from 'oak-domain/lib/store/SyncRowStore'; @@ -260,11 +260,13 @@ export async function startup { const { request } = ctx; - const { contextString, aspectName, data } = connector.parseRequest( + const { contextString, aspectName, data } = await connector.parseRequest( request.headers, request.body, request.files ); - const { result, opRecords, message } = await appLoader.execAspect( - aspectName, - request.headers, - contextString, - data - ); + let result: any; + let opRecords: OpRecord[] = []; + let message: string | undefined = undefined; + + if (connectorCustomAspects && + connectorCustomAspects.findIndex(a => a.name === aspectName) >= 0 + ) { + // 自定义aspect处理 + console.log(`调用Connector自定义Aspect: ${aspectName}`); + const aspect = connectorCustomAspects!.find(a => a.name === aspectName)!; + const res = await aspect.handler( + { + headers: request.headers, + contextString, + params: data, + } + ); + result = res.result; + opRecords = res.opRecords || []; + message = res.message; + } else { + const res = await appLoader.execAspect( + aspectName, + request.headers, + contextString, + data + ); + result = res.result; + opRecords = res.opRecords || []; + message = res.message; + } + const { body, headers } = await connector.serializeResult( result, opRecords, @@ -350,6 +384,12 @@ export async function startup { + ctx.set(key, headers?.[key]) + }) + return; }); @@ -519,15 +559,15 @@ export async function startup