- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
PS.: 我已经阅读了很多类似的主题,但没有一个可以解决我的问题,已经尝试过更改 ormconfig.js 和其他内容的实体上的正则表达式模式。
好吧,几天前我能够成功执行这个 ExpressJS 应用程序,没有出现任何错误。但是现在,它才开始抛出 EntityMetadataNotFound:没有找到“User”的元数据。
。
这是项目的存储库:https://github.com/joaocasarin/gittin
如您所见,我的 entities
和 migrations
指向 dist/entities/*.js
和 dist/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/
这个问题在这里已经有了答案: Different ways of loading a file as an InputStream (6 个答案) 关闭 8 年前。 在我的 gradle java
给定一个 User 类: class User end 我想使用 .class_eval 定义一个新常量.所以: User.class_eval { AVOCADO = 'fruit' } 如果我尝试
这可能听起来很奇怪,但我正在开发一个需要查找 div 内的元素或 div 本身的插件。 脚本根据用户选择查找元素,但内容(包括标记)是可变的。因此脚本将按如下方式查找元素: $('.block').f
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我需要在按我自己的函数排序的对的多集中查找并删除一个值。显然, .find 总是将迭代器返回到末尾,而不是返回到搜索到的值。有小费吗?这是函数: struct cmp { bool operato
求助!我将如何通过遍历查看字符并计算有效字符出现之前的下划线数量来查找和删除前导下划线。以及从字符串末尾向后迭代以查找任何尾随下划线。 我可以使用下面的方法来删除下划线,但是如何迭代才能找到下划线。
如果你在 $(xml) 中有下面的 xml,你会变得懒惰: $(xml).find("animal").find("dog").find("beagle").text() 在 jQuery 中是否有类
你如何找到4个文件的交集? 我用了grep -Fx -f 1.txt 2.txt 3.txt 4.txt ,但它似乎只适用于 2 个文件。同样comm -12 1.txt 2.txt无法扩展为 4 个
我已经完成了标记的姿势估计并获得了 rvec 和 tvec 值。我不知道如何找到它的中心,因为我需要绘制一个需要中心值的圆柱体。 我该怎么做? 最佳答案 标记的 tvec 是标记从原点的平移 (x,y
我有一个任务,我需要找到 2 个单链接(单对单)列表的交集。我还必须为 2 个双向链接(双重 vs 双重)列表执行此操作: 对于单链表,我使用 mergeSort() 对两个列表进行排序,然后逐项比较
我是 R 的新手,我有一个 100x100 的方阵。我想找到这个矩阵的最大特征值。我试过了 is.indefinite(x) 但是它写 is.indefinite(x) : argument x is
您好,我是 svg 和 JavaScript 的新手,当鼠标位于 svg 上方时,我试图使一些 svg 元素弹出(通过缩放),反之亦然,当鼠标离开 svg 元素时。 我已经能够通过使用转换使 svg
我正在尝试为 scala 项目编写一个类,但在多个地方使用 class、def、while 等关键字出现此错误。 它发生在这样的地方: var continue = true while (conti
我有两个 pandas 数据框,它们只取自一列并将日期列设置为索引,所以现在我有两个 Series。我需要找到这些系列的相关性。 这里有几行来自dfd: index change 2018-
我正在尝试调整我的 Vagrantfile,因此如果它丢失,它会自动在项目根目录中创建一个文件夹。创建文件夹没问题,但我无法找到创建该文件夹的位置。 我发现此信息可在 Vagrant::Environ
我正在尝试在 jquery 中找到 Test3 的位置,请有人引导我走上正确的道路。 我需要jquery来显示5 Test7 Test2 Test6 Test5 Test3 Test8 谢谢 最佳
大家早上好 我有一个像这样的图像列表: 使用 jQuery 如何查找 ul#preload 中包含特定字符串(例如“green”)的所有图像 src 类似... var new_src = j
我正在开发一个修改 Excel 文件的应用程序。 如何找到任意行中最后使用的单元格? 示例:行号 => 5 中最后使用的单元格 最佳答案 要找到一行中的最后一个单元格,您需要 Range 的 End
我刚刚陷入 react native ,需要一些帮助才能在找到 token 时导航到 protected 屏幕。我应该在哪里寻找应用程序加载时的 token ?如何在不多次调用导航的情况下导航用户一次
非常奇怪...此页面是 protected 内容还是我不知道的内容?我尝试单击下一页 anchor 。 参见this page first. 我试图用这个来抓取元素 var buttonNext =
我是一名优秀的程序员,十分优秀!