NestJS中Mongoose查询结果无法通过Promise返回至前端求助
解决NestJS从MongoDB获取好友请求并返回前端的问题
1. 规范FriendRequestDocument定义
先确保Mongoose Schema字段完整,匹配业务需求:
// friend-request.schema.ts import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document } from 'mongoose'; export type FriendRequestDocument = FriendRequest & Document; @Schema() export class FriendRequest { @Prop({ required: true }) senderId: string; @Prop({ required: true }) receiverId: string; @Prop({ enum: ['pending', 'accepted', 'rejected'], default: 'pending' }) status: string; @Prop({ default: Date.now }) createdAt: Date; } export const FriendRequestSchema = SchemaFactory.createForClass(FriendRequest);
2. 修正Service层Promise处理
Service直接返回Mongoose查询的Promise(或用async/await语法),避免错误的Promise包装:
// friend-request.service.ts import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import { FriendRequest, FriendRequestDocument } from './friend-request.schema'; @Injectable() export class FriendRequestService { constructor( @InjectModel(FriendRequest.name) private friendRequestModel: Model<FriendRequestDocument>, ) {} // 获取当前用户收到的待处理请求 getReceivedRequests(userId: string): Promise<FriendRequestDocument[]> { return this.friendRequestModel.find({ receiverId: userId, status: 'pending' }).exec(); } // async/await写法示例 async getSentRequests(userId: string): Promise<FriendRequestDocument[]> { return this.friendRequestModel.find({ senderId: userId }).exec(); } }
3. Controller层正确处理异步响应
用async/await接收Service返回的Promise,Nest会自动将结果转为JSON响应:
// friend-request.controller.ts import { Controller, Get, Param } from '@nestjs/common'; import { FriendRequestService } from './friend-request.service'; @Controller('friend-requests') export class FriendRequestController { constructor(private readonly friendRequestService: FriendRequestService) {} @Get('received/:userId') async getReceivedRequests(@Param('userId') userId: string) { return this.friendRequestService.getReceivedRequests(userId); } @Get('sent/:userId') async getSentRequests(@Param('userId') userId: string) { return this.friendRequestService.getSentRequests(userId); } }
4. 前端Angular调用注意事项
确保HttpClient正确发起请求并处理响应:
// friend-request.service.ts (Angular) import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class FriendRequestService { constructor(private http: HttpClient) {} getReceivedRequests(userId: string): Observable<any[]> { return this.http.get<any[]>(`/api/friend-requests/received/${userId}`); } }
常见问题排查
- 确认Mongoose模块已在对应Module中注册,正确导入Schema和Model
- 检查Service方法是否遗漏返回Promise(比如误用
then但未返回结果) - 验证MongoDB服务正常运行,集合中存在测试数据
- 确保Nest已配置CORS,允许前端跨域请求
内容的提问来源于stack exchange,提问作者Alms
相关产品推荐
相关产品推荐

