Nest.js我是和的新手Mikro-ORM,我必须将其作为工作要求来学习。
这个栈需要TypeScript,我打心底里鄙视,但是又不得不做。
我已经设置了我的应用程序,当我执行时npm run start:dev,它启动时没有问题。
但是,当我尝试向数据库添加某些内容时,它会突然出现并给出以下错误块:
[Nest] 5368 - 07/03/2021, 11:52:15 PM [ExceptionsHandler] Trying to persist not discovered entity of type object. +183188ms
ValidationError: Trying to persist not discovered entity of type object.
at Function.notDiscoveredEntity (/home/lazar/tuts/backend/node_modules/@mikro-orm/core/errors.js:51:16)
at SqlEntityManager.persist (/home/lazar/tuts/backend/node_modules/@mikro-orm/core/EntityManager.js:438:48)
at SqlEntityManager.persistAndFlush (/home/lazar/tuts/backend/node_modules/@mikro-orm/core/EntityManager.js:449:20)
at SqlEntityRepository.persistAndFlush (/home/lazar/tuts/backend/node_modules/@mikro-orm/core/entity/EntityRepository.js:21:23)
at UsersService.create (/home/lazar/tuts/backend/dist/users/users.service.js:47:35)
at UsersController.create (/home/lazar/tuts/backend/dist/users/users.controller.js:25:40)
at /home/lazar/tuts/backend/node_modules/@nestjs/core/router/router-execution-context.js:38:29
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async /home/lazar/tuts/backend/node_modules/@nestjs/core/router/router-execution-context.js:46:28
at async /home/lazar/tuts/backend/node_modules/@nestjs/core/router/router-proxy.js:9:17
Run Code Online (Sandbox Code Playgroud)
这是我第一次走进这个堆栈,我不知道该错误意味着什么。当我谷歌这个错误时,我没有得到任何有用的信息。我该怎么做才能让它消失?
User.ts)import { Entity, PrimaryKey, …Run Code Online (Sandbox Code Playgroud) 我正在使用 Docker-compose 构建 Nest.js 应用程序。\n问题是当我尝试“docker-compose up prod”时,它显示“错误:找不到模块 \'/usr/src/app/dist/main”。 \n因此,我探索了产品映像中的文件,但我可以找到 dist 文件夹。另外,我运行 dist/main 并且它有效。但是,我尝试了 docker-compose up prod,它显示了上述错误。\n
此外,当我尝试“docker-compose up dev”时。它工作得很好,为主机创建了一个 dist 文件夹。dev 和 prod 之间的主要区别在于 dev 使用 npm run start:dev 的命令,而 prod 使用 npm run start:prod。
\n这是我的 DockerFile
\n\nWORKDIR /usr/src/app\nCOPY package*.json ./\nRUN npm install rimraf\nRUN npm install --only=development\nCOPY . .\n\nRUN npm run build\n\nFROM node:12.19.0-alpine3.9 as production\nARG NODE_ENV=production\nENV NODE_ENV=${NODE_ENV}\nWORKDIR /usr/src/app\nCOPY package*.json ./\nRUN npm install --only=production\nCOPY . .\nCOPY --from=development /usr/src/app/dist ./dist\nCMD ["node", "dist/main"]\nRun Code Online (Sandbox Code Playgroud)\n这是我的 docker-compose.yaml
\n\nservices:\n proxy:\n image: …Run Code Online (Sandbox Code Playgroud) 我有如下问题
$ prisma migrate dev --name "ok"
Error: P3006
Migration `2021080415559_order_linking` failed to apply clearnly to the shadow database.
Error code: P1014
Error:
The underlying table for model 'Order' does not exist.
Run Code Online (Sandbox Code Playgroud)
如何修复它?
我在 Nestjs 中有这个基本的 CRUD 方法。我面临的问题是,当我getCurrentUserId()在所有方法的顶部应用该方法时,它工作正常,但当我在底部应用该方法时,它不起作用并给出错误。中间件有什么问题吗?
user.controller.ts
@Controller('users')
@Serialize(UserDto)
export class UsersController {
constructor(private usersService: UsersService) {}
@Post('/signup')
create(@Body() createUserDto: CreateUserDto): Promise<User> {
return this.usersService.create(createUserDto);
}
@Get('/@:userName')
async getUserByUsername(@Param('userName') userName: string) {
const user = await this.usersService.findByName(userName);
console.log(userName);
if (!user) {
throw new NotFoundException('User Not Found');
}
return user;
}
//! Testing for current user
@Get('/current')
@UseGuards(JwtAuthGuard)
async getCurrentUserId(@CurrentUser() id: string) {
console.log('running endpoint');
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
current-user.decorator.ts
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const CurrentUser …Run Code Online (Sandbox Code Playgroud) 我正在使用 NestJs。我有这个控制器:
@Get(':id')
@ApiOperation({ summary: 'Get action by id' })
findById(@Param('id') id: string, @Query() query?: SelectQuery & PopulateQuery): Promise<Action> {
return this.actionService.findById(id, query);
}
Run Code Online (Sandbox Code Playgroud)
当我在 Swagger 中打开页面时,它说没有可用的参数。
在Swagger中,如何将参数“id”作为输入框,以便我可以在Swagger(浏览器)中使用它?
谢谢。
我有 jwt 策略:
export class JwtStrategy extends PassportStrategy(Strategy, "jwt") {
constructor() {
super({
ignoreExpiration: false,
secretOrKey: "secret",
jwtFromRequest: ExtractJwt.fromExtractors([
(request: Request) => {
let data = request.cookies['access'];
return data;
}
]),
});
}
async validate(payload: any){
return payload;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
export class AuthController {
constructor(private authService: AuthService) {}
@UseGuards(AuthGuard("jwt"))
@Get()
getPayload() {
//here I need to get the payload that was returned in jwt strategy
}
}
Run Code Online (Sandbox Code Playgroud)
那么如何获取 jwt 策略中返回的控制器中的有效负载呢?
我的用户.module.ts:
import { forwardRef, Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { UserSchema } from './schemas/user.schema';
import { MongooseModule } from '@nestjs/mongoose';
import { AuthModule } from 'src/auth/auth.module';
@Module({
imports: [MongooseModule.forFeature([{name: 'User', schema: UserSchema}]),AuthModule],
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService]
})
export class UsersModule {}
Run Code Online (Sandbox Code Playgroud)
我的 auth.module.ts
import { forwardRef, Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { UsersModule } from '../users/users.module';
import { PassportModule } …Run Code Online (Sandbox Code Playgroud) 我正在构建一个应用程序,其中的微服务通过 RabbitMQ(请求-响应模式)进行通信。
一切正常,但我仍然遇到错误“远程服务中没有定义匹配的消息处理程序”的问题。-
当我将 POST 发送到客户端应用程序时,它应该只是通过客户端(ClientProxy)发送带有数据的消息,并且消费者应用程序应该响应。该功能确实有效,但总是只能第二次。我知道这听起来很奇怪,但在我的第一个 POST 请求中,总是有来自客户端的错误,而我的每一个 POST 请求都有效。然而这个问题在我的整个应用程序中随处可见,因此特定的 POST 请求仅用于示例。
这是代码:
客户:
@Post('devices')
async pushDevices(
@Body(new ParseArrayPipe({ items: DeviceDto }))
devices: DeviceDto[]
) {
this.logger.log('Devices received');
return this.client.send(NEW_DEVICES_RECEIVED, devices)
}
Run Code Online (Sandbox Code Playgroud)
消费者:
@MessagePattern(NEW_DEVICES_RECEIVED)
async pushDevices(@Payload() devices: any, @Ctx() context: RmqContext) {
console.log('RECEIVED DEVICES');
console.log(devices);
const channel = context.getChannelRef();
const originalMsg = context.getMessage();
channel.ack(originalMsg);
return 'ANSWER';
}
Run Code Online (Sandbox Code Playgroud)
客户端的 RMQ 设置为queueOptions: {durable: true},消费者也有queueOptions: {durable: true}和noAck: false
请您知道可能会导致问题的原因吗?我尝试使用 JSON.stringify …
我是 NestJS 的新手,我没有找到任何明确的说明来完成我需要做的事情。
我想使用 NestJS 构建我的后端,我以前从未使用过它,但只听说过它的好东西。因此,我要构建的后端服务器将使用 npmjs 中名为 ccxt 的第 3 方模块。在普通的节点应用程序中,我只需创建一个随机类(例如 CryptoManager),导入 ccxt 模块并编写一些按设定时间间隔运行的函数或其他函数。然后我将创建一个控制器类来实例化该 CryptoManager 类的对象,然后我可以返回它的响应。
但是我应该如何使用 NestJS 来做到这一点呢?为了拥有一个正在运行其他嵌套控制器/服务等中可用的后台任务的自定义类,我必须做什么?
这个类只是应该执行第 3 方 (ccxt) 模块函数并将结果存储在数据库中。但我希望能够从 Nestjs 应用程序中的所有点(从所有模块)执行此类方法。
我希望我的问题很清楚,如果不清楚,请告诉我。
现在我遇到了问题。当我添加多对多关系时,它不起作用。但之前是一对多关系。
用户实体.ts
@Entity({ name: 'users' })
export class User implements IUser {
@PrimaryGeneratedColumn()
id: string;
@Column({ length: 25, nullable: true })
name: string;
@Column({ unique: true, length: 255 })
email: string;
@OneToMany(() => Message, (message) => message.user)
messages?: Message[];
@ManyToMany(() => Conversation, (conversations) => conversations.users)
@JoinTable({
name: 'user_conversation',
joinColumn: { name: 'user_id', referencedColumnName: 'id' },
inverseJoinColumn: { name: 'conversation_id' },
})
conversations: Conversation[];
}
Run Code Online (Sandbox Code Playgroud)
在文件conversation.entity.ts中
@Entity({ name: 'conversations' })
export class Conversation …Run Code Online (Sandbox Code Playgroud) nestjs ×10
node.js ×5
javascript ×3
docker ×2
jwt ×1
mikro-orm ×1
nestjs-jwt ×1
postgresql ×1
prisma ×1
prisma2 ×1
rabbitmq ×1
swagger ×1
swagger-ui ×1
typeorm ×1
typescript ×1