Mongodb Javascript:collection.findOne() 上缺少 BSON 元素“光标”

问题描述 投票:0回答:1

我在 Typescript 中有一个函数,可以检查用户的电子邮件是否已经存在,并将其作为布尔值返回。问题是,每当请求通过 REST 客户端(Postman/Thunder 客户端)发送或通过单元测试执行时,该函数都会完美运行。但是,一旦客户端发送完全相同的请求,我就会收到以下错误:

MongoUnexpectedServerResponseError: BSON element "cursor" is missing
    at CursorResponse.get (C:\Repositories\UAI-express\node_modules\mongodb\src\cmap\wire_protocol\responses.ts:88:13)
    at CursorResponse.get cursor [as cursor] (C:\Repositories\UAI-express\node_modules\mongodb\src\cmap\wire_protocol\responses.ts:216:17)
    ... 6 lines matching cause stack trace ...
    at async FindCursor.next (C:\Repositories\UAI-express\node_modules\mongodb\src\cursor\abstract_cursor.ts:398:7)
    at async Collection.findOne (C:\Repositories\UAI-express\node_modules\mongodb\src\collection.ts:506:17) {
  [Symbol(errorLabels)]: Set(0) {},
  [cause]: BSONError: BSON element "cursor" is missing
      at CursorResponse.get (C:\Repositories\UAI-express\node_modules\mongodb\src\cmap\wire_protocol\on_demand\document.ts:275:15)
      at CursorResponse.get (C:\Repositories\UAI-express\node_modules\mongodb\src\cmap\wire_protocol\responses.ts:86:20)
      at CursorResponse.get cursor [as cursor] (C:\Repositories\UAI-express\node_modules\mongodb\src\cmap\wire_protocol\responses.ts:216:17)
      at CursorResponse.get batch [as batch] (C:\Repositories\UAI-express\node_modules\mongodb\src\cmap\wire_protocol\responses.ts:254:25)
      at CursorResponse.get batchSize [as batchSize] (C:\Repositories\UAI-express\node_modules\mongodb\src\cmap\wire_protocol\responses.ts:262:17)
      at FindCursor._initialize (C:\Repositories\UAI-express\node_modules\mongodb\src\cursor\find_cursor.ts:75:33)
      at processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async FindCursor.cursorInit (C:\Repositories\UAI-express\node_modules\mongodb\src\cursor\abstract_cursor.ts:684:21)
      at async FindCursor.fetchBatch (C:\Repositories\UAI-express\node_modules\mongodb\src\cursor\abstract_cursor.ts:720:7)
      at async FindCursor.next (C:\Repositories\UAI-express\node_modules\mongodb\src\cursor\abstract_cursor.ts:398:7)

这是导致错误的函数:

function createUser(req: Request, res: Response) {
  const body = req.body;
const db = await connectToDb();
    const userProvider = new UserProvider(db);
    const userExists = await userProvider.userExists(body.email);
    if (userExists) {
      return res.status(400).send("User already exists");
    }
    const result = await userProvider.createUser(body);
    return res.json(result);
}

这是检查用户是否存在的代码:

class UserProvider {

    constructor(db: Db) {
        super(db.collection('dashboard_users'));

    }

    async userExists(email: string): Promise<boolean> {
        const user = await this.collection.findOne({ email }, {});
        return !!user;
    }

}

这是客户端代码,使用 Tanstack React Mutation 和 axios

type UserMutationFn = (data: any) => Promise<any>;

export const createAdminUser: UserMutationFn = async (data: any) => secureAPIPOST(`/users/admin`, data);
export const createUser: UserMutationFn = async (data: any) => secureAPIPOST(`/users`, data);
export const deleteUser: UserMutationFn = async (data: any) => secureAPIDELETE(`/users`, null, data);
export const updateUser: UserMutationFn = async (data: any) => secureAPIPOST(`/users`, data);


export default function useUserMutation(mutationFn: UserMutationFn) {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn,
    onError: (error) => {
      console.error(error);
    },
    onSuccess: () => {
      // invalidate dashboard users query
      queryClient.invalidateQueries({
        queryKey: ['dashboard-users']
      });
    }
  });
}

最后,这是

PaginatedProvider

的抽象实现
import { Collection } from "mongodb";

export abstract class PaginatedProvider<T> {

    limit = 10;
    collection: Collection;


    constructor(collection: Collection) {
        this.collection = collection;
    }
}

需要记住的一些注意事项:

  • 这不是唯一的提供程序,我创建的所有其他提供程序都可以完美工作
  • 从客户端调用时,该函数也可以正常运行
  • 尚未发现与 CORS 相关的问题
  • 我找不到此特定错误的任何文档

非常感谢任何帮助

javascript mongodb express rest
1个回答
0
投票

在哪里可以解决这个问题?我遇到了同样的错误并正在尝试解决...

© www.soinside.com 2019 - 2024. All rights reserved.