mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
framework: server.registerRenderer
This commit is contained in:
6 files changed
+24
-11
No files matched your search
@@ -2,4 +2,5 @@
|
|||||||
移除了 ctx.app (请使用 ctx.root)
|
移除了 ctx.app (请使用 ctx.root)
|
||||||
移除了 ctx.options (请使用 ctx.root.config)
|
移除了 ctx.options (请使用 ctx.root.config)
|
||||||
serializer: 移除 showDisplayName 参数
|
serializer: 移除 showDisplayName 参数
|
||||||
移除了 loader.addScript, loader.addon 函数
|
移除了 loader.addScript, loader.addon 函数
|
||||||
|
移除了 Hydro.module.render (请使用 ctx.server.registerRenderer)
|
||||||
@@ -77,10 +77,7 @@ export default (logger, xff, xhost) => async (ctx: KoaContext, next: Next) => {
|
|||||||
}
|
}
|
||||||
response.type = 'application/json';
|
response.type = 'application/json';
|
||||||
} else if (response.template) {
|
} else if (response.template) {
|
||||||
const s = response.template.split('.');
|
response.body = await handler.renderHTML(response.template, response.body || {});
|
||||||
let templateName = `${s[0]}.${args.domainId}.${s[1]}`;
|
|
||||||
if (!global.Hydro.ui.template[templateName]) templateName = response.template;
|
|
||||||
response.body = await handler.renderHTML(templateName, response.body || {});
|
|
||||||
response.type = 'text/html';
|
response.type = 'text/html';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export interface HydroResponse {
|
|||||||
attachment: (name: string, stream?: any) => void;
|
attachment: (name: string, stream?: any) => void;
|
||||||
addHeader: (name: string, value: string) => void;
|
addHeader: (name: string, value: string) => void;
|
||||||
}
|
}
|
||||||
|
export type RendererFunction = (name: string, context: Record<string, any>) => string | Promise<string>;
|
||||||
type HydroContext = {
|
type HydroContext = {
|
||||||
request: HydroRequest;
|
request: HydroRequest;
|
||||||
response: HydroResponse;
|
response: HydroResponse;
|
||||||
@@ -163,8 +164,7 @@ export class HandlerCommon {
|
|||||||
|
|
||||||
renderHTML(templateName: string, args: Record<string, any>) {
|
renderHTML(templateName: string, args: Record<string, any>) {
|
||||||
const type = templateName.split('.')[1];
|
const type = templateName.split('.')[1];
|
||||||
const engine = global.Hydro.module.render[type]
|
const engine = this.ctx.server.renderers[type] || (() => JSON.stringify(args, serializer(false, this)));
|
||||||
|| (() => JSON.stringify(args, serializer(false, this)));
|
|
||||||
return engine(templateName, {
|
return engine(templateName, {
|
||||||
handler: this,
|
handler: this,
|
||||||
UserContext: this.user,
|
UserContext: this.user,
|
||||||
@@ -316,6 +316,7 @@ export class WebService extends Service {
|
|||||||
private wsLayers = [];
|
private wsLayers = [];
|
||||||
private captureAllRoutes = {};
|
private captureAllRoutes = {};
|
||||||
|
|
||||||
|
renderers: Record<string, RendererFunction> = {};
|
||||||
server = koa;
|
server = koa;
|
||||||
router = router;
|
router = router;
|
||||||
HandlerCommon = HandlerCommon;
|
HandlerCommon = HandlerCommon;
|
||||||
@@ -657,6 +658,14 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`);
|
|||||||
HandlerCommon.prototype[val] = MixinClass[val];
|
HandlerCommon.prototype[val] = MixinClass[val];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public registerRenderer(name: string, func: RendererFunction) {
|
||||||
|
if (this.renderers[name]) logger.warn('Renderer %s already exists.', name);
|
||||||
|
this.renderers[name] = func;
|
||||||
|
this[Context.current]?.on('dispose', () => {
|
||||||
|
delete this.renderers[name];
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module 'cordis' {
|
declare module 'cordis' {
|
||||||
|
|||||||
@@ -802,7 +802,6 @@ export interface ModuleInterfaces {
|
|||||||
callback: (this: Handler, args: Record<string, any>) => Promise<OAuthUserResponse>;
|
callback: (this: Handler, args: Record<string, any>) => Promise<OAuthUserResponse>;
|
||||||
};
|
};
|
||||||
hash: (password: string, salt: string, user: User) => boolean | string | Promise<string>;
|
hash: (password: string, salt: string, user: User) => boolean | string | Promise<string>;
|
||||||
render: (name: string, state: any) => string | Promise<string>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HydroGlobal {
|
export interface HydroGlobal {
|
||||||
|
|||||||
@@ -78,6 +78,12 @@ export class Handler extends HandlerOriginal {
|
|||||||
constructor(_, ctx: Context) {
|
constructor(_, ctx: Context) {
|
||||||
super(_, ctx);
|
super(_, ctx);
|
||||||
this.ctx = ctx.extend({ domain: this.domain });
|
this.ctx = ctx.extend({ domain: this.domain });
|
||||||
|
this.renderHTML = ((orig) => function (name: string, args: Record<string, any>) {
|
||||||
|
const s = name.split('.');
|
||||||
|
let templateName = `${s[0]}.${args.domainId}.${s[1]}`;
|
||||||
|
if (!global.Hydro.ui.template[templateName]) templateName = name;
|
||||||
|
return orig(templateName, args);
|
||||||
|
})(this.renderHTML).bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onerror(error: HydroError) {
|
async onerror(error: HydroError) {
|
||||||
|
|||||||
@@ -181,8 +181,9 @@ const render = (name: string, state: any) => new Promise<string>((resolve, rejec
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const inject = ['server'];
|
||||||
export async function apply(ctx: Context) {
|
export async function apply(ctx: Context) {
|
||||||
ctx.provideModule('render', 'html', render);
|
ctx.server.registerRenderer('html', render);
|
||||||
ctx.provideModule('render', 'yaml', render);
|
ctx.server.registerRenderer('yaml', render);
|
||||||
ctx.provideModule('render', 'md', render);
|
ctx.server.registerRenderer('md', render);
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user