繁体   English   中英

在 typeorm 中获取 RepositoryNotFoundError 但我很确定它们已注册

[英]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 位置,这将与两个不同的节点进程不同。

你有几个选择:

  1. 如果你只是想看点什么,那就把users.ts的第 9 行改成const repo = db.getRepository('User'); - 引用实体名称。 TypeORM 还可以按名称查找实体。 这行得通。 当我这样做时,我得到了成功的回应。
  2. 深入了解 Vercel 和 TypeScript 中的最佳实践。 对不起,不能帮你!

我不知道这只是一个学习项目还是一个百万美元的应用程序。 如果是后者,我肯定想确保 Vercel 处理您的 API 端点的方式是最佳实践。 我只知道这个框架的声誉,但在我看来,那里的方法适合 static 内容。 我不确定您为什么不希望您的 API 与您的服务器一起被转译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM