1

我们有一个使用字符串 ID(没有 12 个字节 || 24 十六进制)的 MongoDB 数据库,这些 ID 是由 MeteorJS 生成的。

我们现在使用 apollo 服务器开发一个 GraphQL 层。

我们想使用 apollo-datasource-mongodb 来加载我们的数据,但是当我们调用 findOnebyId 方法时,我们得到了这个错误:

Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
    at new ObjectID (/app/node_modules/bson/lib/bson/objectid.js:59:11)
    at Function.ObjectID (/app/node_modules/bson/lib/bson/objectid.js:40:43)
    at file:///app/connectors/legacy.js:3:21
    at ModuleJob.run (internal/modules/esm/module_job.js:152:23)
    at async Loader.import (internal/modules/esm/loader.js:166:24)
    at async Object.loadESM (internal/process/esm_loader.js:68:5)
/app/node_modules/bson/lib/bson/objectid.js:59

这是因为模块尝试将我们的字符串 Id 转换为 MongoDB ObjectId,这在我们当前的 Id 格式下是不可能的。

看了apollo-datasource-mongodb repo,好像可以处理字符串Id

    findOneById(
      id: ObjectId | string,
      options?: Options
    ): Promise<TData | null | undefined>

来源:https ://github.com/GraphQLGuide/apollo-datasource-mongodb/blob/master/index.d.ts

我们的用户数据源:

import { MongoDataSource } from 'apollo-datasource-mongodb'

export class Users extends MongoDataSource {
}

启动(上下文层):

Users: new Users(legacy.collection('users'))

调用(模型层):

async findOneById(obj, { id }, {dataSources: { Users }}) {
  return await Users.findOneById(id)
}

我们不使用猫鼬和打字稿。

有没有人有想法让它工作?

4

1 回答 1

0

我发现这与字符串 id 不兼容。更多细节可以在这里找到

于 2021-01-05T16:37:42.757 回答