我们有一个使用字符串 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)
}
我们不使用猫鼬和打字稿。
有没有人有想法让它工作?