node.js - Apollo Server Express + GraphQL 关系
问题描述
我正在使用 Express + Apollo Server + GraphQL + Mongoose + MongoDB 在数据库上“执行”几个 CRUD 操作。
我正在尝试进行的操作之一是从数据库中获取站点并使用每个记录的信息扩展其用户,如下所示:
query {
getSites {
id
name
owner {
name
email
}
origins
}
}
相反,我得到了这些结果:
{
"data": {
"getSites": [{
"id": "5cae36182ab9b94e94ba9af5",
"name": "Test site 1",
"owner": [{
"name": null,
"email": null
}
],
"origins": [
"test1",
"test2"
]
}, {
"id": "5cae3a3798c302247c036544",
"name": "Test site 2",
"owner": [{
"name": null,
"email": null
}
],
"origins": [
"test1",
"test2"
]
}
]
}
}
这是我的Site的typeDef代码:
import { gql } from 'apollo-server-express';
const site = gql `
extend type Site {
id: ID!
name: String!
origins: [String]
owner: [User]
createdOn: String
updatedOn: String
}
extend type Query {
getSites: [Site]
getSite(id: ID!): Site
}
extend type Mutation {
addSite(name: String!, owner: [String!], origins: [String]): Site
}
`;
export default site;
如果我console.log(sites)
看到所有者是一个字符串数组。
编辑:
如果我改变addSite(name: String!, owner: [User], origins: [String]): Site
,那么我在编译时得到:
错误:Mutation.addSite(owner:) 的类型必须是 Input Type 但得到:[User]
我的解析器如下所示:
getSites: async () => await Site.find().exec()
今天定义关系的正确方法是什么?谢谢。
解决方案
我刚刚编辑了我的解析器:
getSites: async () => {
let sites = await Site.find().exec();
let ownedSites = await User.populate(sites, { path: 'owner' });
return ownedSites;
}
这解决了错误。
推荐阅读
- google-apps-marketplace - 菜单项未出现在 G Suite Marketplace 中发布的表格插件中
- python - 序数数据集
- sql - sequelize 嵌套包含结果集父对象
- docker - 如何识别 Docker 命令和主机命令
- android - 我可以在我的 apk 中为 arm abi 使用预构建的共享库(.so),而无需 NDK?
- python - 正则表达式将符号插入数字字符串python
- android - 使用隐式意图在同一个应用程序中启动另一个活动
- .net - VB.NET 类在 COM 中获取程序集名称前面的名称?
- database - 数据库崩溃,Redis 单独停止
- javascript - 无法将 event.target 转换为字符串