You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:45:31