gpt4 book ai didi

javascript - 实体元数据未找到 : No metadata for "User" was found

转载 作者:行者123 更新时间:2023-12-05 04:47:01 25 4
gpt4 key购买 nike

PS.: 我已经阅读了很多类似的主题,但没有一个可以解决我的问题,已经尝试过更改 ormconfig.js 和其他内容的实体上的正则表达式模式。

好吧,几天前我能够成功执行这个 ExpressJS 应用程序,没有出现任何错误。但是现在,它才开始抛出 EntityMetadataNotFound:没有找到“User”的元数据。

这是项目的存储库:https://github.com/joaocasarin/gittin

如您所见,我的 entitiesmigrations 指向 dist/entities/*.jsdist/database/migrations/*.js,因为我读到 TypeORM 在 typescript 中无法使用它们(使用 ts-node-dev 运行应用程序,如果实体在 .ts 中,我会收到错误消息说我不能在普通 javascript 文件上使用来自 ES6+ 的导入和内容。如果我使用 .ts 文件运行迁移,则找不到要运行的迁移。)此外,您会看到我的实体、存储库、服务和 Controller 都是正确的(我看不出它们有任何问题),但是,当我尝试与数据库进行交互时,我仍然会遇到该错误。

失眠请求正文:/POST http://localhost:3000/api/users

{
"name": "123",
"password": "123",
"email": "docker@123.com",
"admin": true
}

回复:

{
"error": {
"name": "EntityMetadataNotFound",
"message": "No metadata for \"User\" was found."
}
}

终端错误:

EntityMetadataNotFound: No metadata for "User" was found.
at new EntityMetadataNotFoundError (C:\Users\joaov\Documents\gittin\src\error\EntityMetadataNotFoundError.ts:10:9)
at Connection.getMetadata (C:\Users\joaov\Documents\gittin\src\connection\Connection.ts:337:19)
at EntityManager.getCustomRepository (C:\Users\joaov\Documents\gittin\src\entity-manager\EntityManager.ts:976:86)
at Connection.getCustomRepository (C:\Users\joaov\Documents\gittin\src\connection\Connection.ts:372:29)
at Object.getCustomRepository (C:\Users\joaov\Documents\gittin\src\index.ts:298:55)
at CreateUserService.<anonymous> (C:\Users\joaov\Documents\gittin\src\services\CreateUserService.ts:14:37)
at step (C:\Users\joaov\Documents\gittin\src\services\CreateUserService.ts:33:23)
at Object.next (C:\Users\joaov\Documents\gittin\src\services\CreateUserService.ts:14:53)
at C:\Users\joaov\Documents\gittin\src\services\CreateUserService.ts:8:71
at new Promise (<anonymous>)

为了方便起见,这些是我认为的相关文件。请告诉我是否还有其他相关文件:

package.json:

{
"name": "gittin",
"version": "1.0.0",
"main": "./dist/index.js",
"repository": "https://github.com/joaocasarin/gittin.git",
"author": "Joao Casarin <joaovitorcasarin@hotmail.com>",
"license": "MIT",
"scripts": {
"db": "docker-compose -f ./docker-compose.db.yml up --build -d",
"docker:dev": "docker-compose -f ./docker-compose.dev.yml up --build -d",
"docker:prod": "docker-compose -f ./docker-compose.yml up --build -d",
"docker:clear": "docker-compose down -v --rmi local",
"docker:stop": "docker-compose down",
"dev": "ts-node-dev ./src/index.ts",
"test": "jest",
"migration:run": "ts-node-dev ./node_modules/typeorm/cli.js migration:run",
"migration:create": "ts-node-dev ./node_modules/typeorm/cli.js migration:create",
"entity:create": "ts-node-dev ./node_modules/typeorm/cli.js entity:create",
"build": "tsc",
"start": "node ."
},
"dependencies": {
"axios": "^0.21.1",
"bcryptjs": "^2.4.3",
"class-transformer": "^0.4.0",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"express-async-errors": "^3.1.1",
"jsonwebtoken": "^8.5.1",
"pg": "^8.6.0",
"reflect-metadata": "^0.1.13",
"typeorm": "^0.2.34",
"uuid": "^8.3.2"
},
"devDependencies": {
"@types/babel__core": "^7.1.15",
"@types/bcryptjs": "^2.4.2",
"@types/cors": "^2.8.10",
"@types/express": "^4.17.12",
"@types/jest": "^26.0.23",
"@types/jsonwebtoken": "^8.5.4",
"@types/node": "^15.12.4",
"@types/supertest": "^2.0.11",
"@types/uuid": "^8.3.1",
"jest": "^27.0.5",
"supertest": "^6.1.3",
"ts-jest": "^27.0.3",
"ts-node-dev": "^1.1.6",
"typescript": "^4.3.4"
}
}

ormconfig.js:

module.exports = {
"type": "postgres",
"ssl": process.env.NODE_ENV === 'production'
&& process.env.DATABASE_URL !== 'postgres://postgres:docker@localhost:5432/gittin'
&& process.env.DATABASE_URL !== 'postgres://postgres:docker@db:5432/gittin' ? { rejectUnauthorized: false } : false,

"url": process.env.DATABASE_URL,

"entities": ["dist/entities/*.js"], // typeorm loads entities from this directory
"migrations": ["dist/database/migrations/*.js"], // typeorm loads migrations from the directory

"dropSchema": process.env.NODE_ENV === 'test' ? true : false,
"migrationsRun": process.env.NODE_ENV !== 'production' ? true : false,

"cli": {
"migrationsDir": "src/database/migrations", // typeorm creates migrations in this directory
"entitiesDir": "src/entities" // typeorm creates entities in this directory
}
}

src/entities/User.ts:

import { Entity, PrimaryColumn, Column, CreateDateColumn, UpdateDateColumn } from "typeorm";
import { Exclude } from "class-transformer";
import { v4 as uuid } from "uuid";

@Entity("users")
class User {

@PrimaryColumn()
readonly id: string;

@Column()
name: string;

@Column()
email: string;

@Column()
admin: boolean;

@Exclude()
@Column()
password: string;

@CreateDateColumn()
created_at: Date;

@UpdateDateColumn()
updated_at: Date;

constructor() {
if (!this.id) {
this.id = uuid();
}
}
}

export { User };

src/repositories/UserRepositories.ts:

import { EntityRepository, Repository } from "typeorm";
import { User } from "../entities/User";

@EntityRepository(User)
class UsersRepositories extends Repository<User> {}

export { UsersRepositories };

src/services/CreateUserService.ts:

import { getCustomRepository } from "typeorm";
import { UsersRepositories } from "../repositories/UsersRepositories";
import { hash } from "bcryptjs";

interface IUserRequest {
name: string;
email: string;
admin?: boolean;
password: string;
}

class CreateUserService {
async execute({ name, email, admin = false, password }: IUserRequest) {
const usersRepository = getCustomRepository(UsersRepositories);

if(!email) {
throw new Error('Incorrect e-mail.');
}

const userAlreadyExists = await usersRepository.findOne({ email });

if(userAlreadyExists) {
throw new Error('User already exists.');
}

const passwordHash = await hash(password, 8);

const user = usersRepository.create({ name, email, admin, password: passwordHash });

await usersRepository.save(user);

return user;
}
}

export { CreateUserService };

src/controllers/CreateUserController.ts:

import { Request, Response } from "express";
import { CreateUserService } from "../services/CreateUserService";

class CreateUserController {
async handle(request: Request, response: Response) {
try {
const { name, email, admin, password } = request.body;

const createUserService = new CreateUserService();

const user = await createUserService.execute({ name, email, admin, password });

return response.send(user);
} catch (error) {
return response.send({ error });
}
}
}

export { CreateUserController };

src/routes/index.ts:

import { Router, Request, Response, NextFunction } from "express";
import { CreateUserController } from "../controllers/CreateUserController";

const router = Router();

const createUserController = new CreateUserController();
router.post('/users', createUserController.handle);

export default router;

最佳答案

首先,您的 git 存储库对查找问题很有帮助。您只需要像下面这样更新您的 ormconfig.js 文件:

module.exports = {
...
"entities": ["src/entities/*{.js,.ts}"], // typeorm loads entities from this directory
...
}
}

我只测试了 npm run dev,它使用 ts-node-dev 来执行你的文件。

也许您可能需要在编译并在生产环境中运行时更改它。

关于javascript - 实体元数据未找到 : No metadata for "User" was found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68642669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com