【问题标题】:Use String id instead of ObjectId with MongoDataSource (apollo server)在 MongoDataSource (apollo server) 中使用 String id 而不是 ObjectId
【发布时间】:2021-04-11 02:28:02
【问题描述】:

我们有一个使用字符串 ID 的 MongoDB 数据库(没有 12 个字节 || 24 十六进制) 论文 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)
}

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

有没有人想办法让它发挥作用?

【问题讨论】:

    标签: node.js mongodb meteor apollo-server apollo-datasource


    【解决方案1】:

    我发现它与字符串 id 不兼容。 更多详情可查看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多