如何发布或分发使用 mikro-orm 的应用程序?



在配置中,我必须指定定义实体的.js和.ts文件的路径:

MikroORM.init({
...
entitiesDirs: ["build/entities"],
entitiesDirsTs: ["src/entities"],
});

所以,当我去发布或分发应用程序时。我也需要分发打字稿代码吗?还是只需要分发生成的缓存?还是我需要同时分发两者?或。。。没有?

自 MikroORM v2.2 起

现在您可以使用默认的元数据提供程序,仅当您在装饰器中不提供entitytype选项时,它才需要实体源文件(您可以使用entity回调来使用对实体类的引用,而不是在type中使用字符串名称,句柄通过 IDE 像 webstorm 一样进行重构)。

原答案:

您也应该交付打字稿代码,并让缓存在服务器上重新生成 - 无论如何都会重建缓存,因为它会检查缓存实体的绝对路径是否失效。

如果您不想交付打字稿代码,则可以实现自己的缓存适配器或元数据提供程序来解决此问题。

这是实现自定义元数据提供程序的方法,该提供程序在缺少类型选项时仅引发错误:

import { MetadataProvider, Utils } from 'mikro-orm';
import { EntityMetadata } from 'mikro-orm/dist/decorators';
export class SimpleMetadataProvider extends MetadataProvider {
async loadEntityMetadata(meta: EntityMetadata, name: string): Promise<void> {
// init types and column names
Object.values(meta.properties).forEach(prop => {
if (prop.entity) {
prop.type = Utils.className(prop.entity());
} else if (!prop.type) {
throw new Error(`type is missing for ${meta.name}.${prop.name}`)
}
});
}
}

然后在初始化时提供此类:

const orm = await MikroORM.init({
// ...
metadataProvider: SimpleMetadataProvider,
});

type的值应该是 JS 类型,例如string/number/Date...您可以观察缓存的元数据以确定应该存在哪些值。

另请记住,如果没有 TS 元数据提供程序,您还需要@ManyToOne装饰器中指定实体类型(通过entity回调或通过type作为字符串)。

相关内容

  • 没有找到相关文章

最新更新