我正在尝试遵循 lireddit 教程,并且遇到了第一个 mikro-orm 迁移。
我遇到了与这篇文章中报告的相同的问题。
我已经修改了示例实体构造函数(尽管使用 mikro-orm 文档中提供的格式会导致相同的问题)。
目前,我有一个Posts.ts
文件:
import { Entity, PrimaryKey, Property } from "@mikro-orm/core";
// import { v4 } from 'uuid';
@Entity()
export class Post {
@PrimaryKey()
id!: number;
// uuid: string = v4();
// @SerializedPrimaryKey()
// id!: string;
@Property({ type: "date" })
createdAt: Date = new Date();
@Property({ type: "date", onUpdate: () => new Date() })
updatedAt: Date = new Date();
@Property({ type: "text" })
title!: string;
}
代码运行:
const main = async () => {
const orm = await MikroORM.init(config);
await orm.getMigrator().up();
const post = orm.em.create(Post, {title: "first title"});
await orm.em.persistAndFlush(post);
};
main().catch((err) => {
console.log(err);
});
错误消息说:
NotNullConstraintViolationException:插入“post”(“created_at”、“title”、“updated_at”)值('2021-08-18T22:13:54.599Z'、'first title'、'2021-08-18T22:13:54.599 Z') 返回“id” - 关系“post”的“_id”列中的空值违反 PostgreSqlExceptionConverter.convertException 的非空约束
我不知道这意味着什么或如何在id
列上设置一个数字。我注意到 mikro-orm 文档使用下划线前缀定义主键(也不确定下划线在做什么),并将其指定为 ObjectId,然后使用序列化的主键。我试过使用这种格式并得到同样的错误。
我也试过:
添加
uuid
为主键(而不是id
) - 显示在上面的注释代码中,但我得到了同样的错误。post
在const中添加一个数字作为 id :const post = orm.em.create(Post, {title: "first title", id: 2});
这也会生成一个 NotNullConstraintViolationException: 错误,说它id
是空的。
这篇文章的建议之一是将以下内容添加到
index.ts
.const generator = orm.getSchemaGenerator(); await generator.updateSchema();
我试过这个,当我运行时yarn dev
,终端只是挂在启动命令上(手表环境中没有显示错误)。
yarn run v1.22.11
$ nodemon dist/index.js
[nodemon] 2.0.12
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node dist/index.js`
- 我删除了这两行并再次尝试,这次使用
mikro-orm migration:create
命令上的初始标志(在删除我的节点模块文件夹、dist
文件夹和src/migrations
文件夹之后)。
当我尝试时,它说
Error: Initial migration cannot be created, as some migrations already exist. The files listed are in the node modules folder.
- 我还尝试设置
useTsNode
为true
inpackage.json
- 并遇到与上述相同的问题。
有没有人弄清楚这一点?
我注意到的一件事是,在删除 dist 文件夹和节点模块并重新运行 yarn 后,该dist/index.js
文件看起来不像 Ben 的原始文件。它现在说:
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@mikro-orm/core");
const Post_1 = require("./entities/Post");
const mikro_orm_config_1 = __importDefault(require("./mikro-orm.config"));
const main = () => __awaiter(void 0, void 0, void 0, function* () {
const orm = yield core_1.MikroORM.init(mikro_orm_config_1.default);
yield orm.getMigrator().up();
const post = orm.em.create(Post_1.Post, { title: "first title" });
yield orm.em.persistAndFlush(post);
});
main().catch((err) => {
console.log(err);
});
//# sourceMappingURL=index.js.map
然后我尝试创建一个新实体,称为Posted
(与 相同Post
,但名称相同)。
当我尝试创建该迁移(必须是新的)时,我收到一条错误消息:
TypeError:无法使用“in”运算符在未定义中搜索“schema”
然后它会列出文件node_modules
夹中的许多文件,如
at MetadataDiscovery.prepare node_modules/@mikro-orm/core/metadata/MetadataDiscovery.js:135:22)
at MetadataDiscovery.discoverReferences /@mikro-orm/core/metadata/MetadataDiscovery.js:125:48)
at MetadataDiscovery.findEntities node_modules/@mikro-orm/core/metadata/MetadataDiscovery.js:71:20)
at async MetadataDiscovery.discover /node_modules/@mikro-orm/core/metadata/MetadataDiscovery.js:34:9)
at async Function.init /node_modules/@mikro-orm/core/MikroORM.js:42:24)