[英]TYPEORM RepositoryNotFoundError: No repository for "i" was found. Looks like this entity is not registered in current "default" connection?
[英]Getting RepositoryNotFoundError in typeorm but I'm pretty sure they are registered
我正在使用 Next.js + TypeORM 编写应用程序并遇到集成问题。
RepositoryNotFoundError:找不到“用户”的存储库。 看起来这个实体没有在当前的“默认”连接中注册?
据我所知,我已经正确配置了所有内容,但继续收到此错误。 我已经调试并检查了活动连接,并查看了connection.options.entities
上的实体,因此它们已注册。 真的被这个给难住了。
回购: https://github.com/kyleect/bolt
服务器:
import "reflect-metadata";
import { createServer } from "http";
import { parse } from "url";
import { createConnection } from "typeorm";
import path from "path";
import next from "next";
import { Link } from "../entities/Link";
import { Post } from "../entities/Post";
import { User } from "../entities/User";
const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();
app
.prepare()
.then(() =>
createConnection({
type: "sqlite",
database: "local.db",
synchronize: true,
logging: true,
entities: [Link, Post, User],
})
)
.then(() => {
createServer((req, res) => {
handle(req, res, parse(req.url, true));
}).listen(3000, () => {
console.log("> Ready on http://localhost:3000");
});
});
端点处理程序之一。 它们都有一个类似的,它们都抛出一个错误:
const db = await getConnection();
const repo = db.getRepository(User);
const users = await repo.find();
res.json(users);
实体:
import {
Entity,
Column,
PrimaryGeneratedColumn,
OneToMany,
CreateDateColumn,
UpdateDateColumn,
DeleteDateColumn,
} from "typeorm";
import { Post } from "./Post";
@Entity()
export class Link {
@PrimaryGeneratedColumn("uuid")
id: string;
@CreateDateColumn()
createdDate: Date;
@UpdateDateColumn()
updatedDate: Date;
@DeleteDateColumn()
deletedDate: Date;
@Column({ type: "varchar" })
url: string;
@OneToMany((type) => Post, (post) => post.link)
posts: Array<Post>;
}
import {
Entity,
Column,
PrimaryGeneratedColumn,
ManyToOne,
CreateDateColumn,
UpdateDateColumn,
DeleteDateColumn,
} from "typeorm";
import { User } from "./User";
import { Link } from "./Link";
@Entity()
export class Post {
@PrimaryGeneratedColumn("uuid")
id: string;
@CreateDateColumn()
createdDate: Date;
@UpdateDateColumn()
updatedDate: Date;
@DeleteDateColumn()
deletedDate: Date;
@ManyToOne((type) => User, (user) => user.posts)
user: User;
@Column({ type: "varchar" })
title: string;
@Column({ type: "varchar" })
body: string;
@ManyToOne((type) => Link, (link) => link.posts)
link: Link;
}
import {
Entity,
Column,
PrimaryGeneratedColumn,
OneToMany,
DeleteDateColumn,
UpdateDateColumn,
CreateDateColumn,
} from "typeorm";
import { Post } from "./Post";
@Entity()
export class User {
@PrimaryGeneratedColumn("uuid")
id: string;
@CreateDateColumn()
createdDate: Date;
@UpdateDateColumn()
updatedDate: Date;
@DeleteDateColumn()
deletedDate: Date;
@Column({ type: "varchar" })
username: string;
@OneToMany((type) => Post, (post) => post.user)
posts: Array<Post>;
}
它没有找到您的实体的原因是因为您的项目设置方式正在将您的 server.ts 转换为 JavaScript 并运行node./dist/src/server.js
,但是 users.ts 中的 api 端点没有被转换提前,而是通过您的框架被 webpacked 并加载为 ESModule。
我不确定设置它的正确方法是什么,但我相信您有两种不同的方法来转换 TypeScript 是问题的原因。 在 TypeORM 内部,它将您想要的 class User
与作为实体提供给 TypeORM 的 class 进行比较。 由于我上面提到的,这种相等比较将失败。 在 JavaScript 中,object 的相等比较实际上查看了 memory 位置,这将与两个不同的节点进程不同。
你有几个选择:
users.ts
的第 9 行改成const repo = db.getRepository('User');
- 引用实体名称。 TypeORM 还可以按名称查找实体。 这行得通。 当我这样做时,我得到了成功的回应。我不知道这只是一个学习项目还是一个百万美元的应用程序。 如果是后者,我肯定想确保 Vercel 处理您的 API 端点的方式是最佳实践。 我只知道这个框架的声誉,但在我看来,那里的方法适合 static 内容。 我不确定您为什么不希望您的 API 与您的服务器一起被转译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.