如何表示可以是简单 ObjectId
字符串或填充对象实体的字段?
我有一个表示“设备类型”的 Mongoose 架构,如下所示
// assetSchema.js
import * as mongoose from 'mongoose'
const Schema = mongoose.Schema;
var Asset = new Schema({ name : String,
linked_device: { type: Schema.Types.ObjectId,
ref: 'Asset'})
export AssetSchema = mongoose.model('Asset', Asset);
我试图将其建模为 GraphQLObjectType,但我对如何允许 linked_ue
字段采用两种类型的值感到困惑,一种是 ObjectId
和其他是完整的 Asset
对象(填充时)
// graphql-asset-type.js
import { GraphQLObjectType, GraphQLString } from 'graphql'
export var GQAssetType = new GraphQLObjectType({
name: 'Asset',
fields: () => ({
name: GraphQLString,
linked_device: ____________ // stumped by this
});
我已经研究过联合类型,但问题是联合类型需要将字段规定为其定义的一部分,而在上述情况下,linked_device
下没有字段linked_device
对应一个简单的 ObjectId
时的字段。
有什么想法吗?
最佳答案
事实上,您可以使用 union或 interface linked_device
字段的类型。
使用联合类型,可以如下实现GQAssetType
:
// graphql-asset-type.js
import { GraphQLObjectType, GraphQLString, GraphQLUnionType } from 'graphql'
var LinkedDeviceType = new GraphQLUnionType({
name: 'Linked Device',
types: [ ObjectIdType, GQAssetType ],
resolveType(value) {
if (value instanceof ObjectId) {
return ObjectIdType;
}
if (value instanceof Asset) {
return GQAssetType;
}
}
});
export var GQAssetType = new GraphQLObjectType({
name: 'Asset',
fields: () => ({
name: { type: GraphQLString },
linked_device: { type: LinkedDeviceType },
})
});
关于node.js - 在 GraphQL 中处理 Mongoose 填充字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41416005/