Javascript 猫鼬&x2B;GraphQL无法填充模型
嗯,我知道关于这个问题有很多问题,但他们的解决方案对我都不起作用,或者我找不到发生了什么 我有一个在本地主机上运行Apollo server+Mongoose的后端服务器。我的问题是我无法填充或创建集合,因为我得到: 错误:Javascript 猫鼬&x2B;GraphQL无法填充模型,javascript,mongodb,mongoose,graphql,apollo-server,Javascript,Mongodb,Mongoose,Graphql,Apollo Server,嗯,我知道关于这个问题有很多问题,但他们的解决方案对我都不起作用,或者我找不到发生了什么 我有一个在本地主机上运行Apollo server+Mongoose的后端服务器。我的问题是我无法填充或创建集合,因为我得到: 错误:“ID不能表示值:” 这就是模型: 从“猫鼬”导入猫鼬; const Float=require('mongoose-Float')。加载类型(mongoose); const gastoSchema=新猫鼬模式({ description:String, 重要事项:浮动,
“ID不能表示值:”
这就是模型:
从“猫鼬”导入猫鼬;
const Float=require('mongoose-Float')。加载类型(mongoose);
const gastoSchema=新猫鼬模式({
description:String,
重要事项:浮动,
证明人:{
类型:mongoose.Schema.Types.ObjectId,
参考:“证明人”
},
}, {
时间戳:{
createdAt:“fechacreation”,
更新日期:“Fechazacion”
}
});
导出默认mongoose.model('gastos',gastoSchema);
这是我的类型定义:
从“阿波罗服务器”导入{gql};
导出默认gql`
加斯托型{
id:id
描述:字符串
进口:浮动
证明人:证明人
}
扩展类型查询{
加斯托斯:[加斯托]
加斯托(id:id!):加斯托
}
扩展型突变{
crearGasto(description:String,import:Float,proveedor:ID):Gasto
actualizarGasto(id:id!,description:String,import:Float,proveedor:id):Gasto
eliminarGasto(id:id!):字符串
}
`;
这是我的解析器:
从“../models/Gasto”导入Gasto;
导出默认值{
查询:{
gastos:()=>Gasto.find().populate('proveedores').exec(),
gasto:({id})=>gasto.findById(id).populate('proveedores').exec()
},
突变:{
crearGasto:(输入)=>Gasto.create(输入),
实现:输入=>Gasto.findOneAndUpdate(输入),
eliminarGasto:({id})=>Gasto.findOneAndDelete(id)
}
};
尝试1
我在模型定义上尝试了此更改,但无效:
从“猫鼬”导入猫鼬;
const Float=require('mongoose-Float')。加载类型(mongoose);
const ObjectId=require('mongoose')。Types.ObjectId;
ObjectId.prototype.valueOf=function(){返回this.toString();}
const gastoSchema=新猫鼬模式({
description:String,
重要事项:浮动,
证明人:{
类型:ObjectId,
参考:“证明人”
},
}, {
时间戳:{
createdAt:“fechacreation”,
更新日期:“Fechazacion”
}
});
导出默认mongoose.model('gastos',gastoSchema);
尝试2
根据测试结果,我还尝试在populate('proveedores')
(复数)、populate('proveedor')(单数)
之间切换,但错误发生了变化:
从“../models/Gasto”导入Gasto;
导出默认值{
查询:{
gastos:()=>Gasto.find({}).populate('proveedor').exec(),
gasto:({id})=>gasto.findById(id).populate('proveedor').exec()
},
突变:{
crearGasto:(输入)=>Gasto.create(输入),
实现:输入=>Gasto.findOneAndUpdate(输入),
eliminarGasto:({id})=>Gasto.findOneAndDelete(id)
}
};
错误:“消息”:“尚未为模型\“Proveedor\”注册架构\n使用mongoose.model(名称,架构)”
以防万一,这是我的Proveedor
模型定义:
从“猫鼬”导入猫鼬;
const proveedorSchema=新的mongoose.Schema({
名义:{
类型:字符串,
必填项:true
},
电话线,
指令:字符串,
电子邮件:String,
}, {
时间戳:{
createdAt:“fechacreation”,
更新日期:“Fechazacion”
}
});
导出默认mongoose.model('proveedores',proveedorSchema);
这就是我在GraphQL游乐场上查询的内容:
query {
gastos {
id
importe
proveedor {
id
nombre
}
}
}
有什么线索吗?提前感谢。mongoose.model()的第一个参数必须是,因此对于您的情况:
mongoose.model('Gasto', gastoSchema);
mongoose.model('Proveedor', proveedorSchema);
接下来,您必须为proveedor
字段和.exec()
添加一个解析器来执行mongoose查询
import Gasto from '../models/Gasto';
import Proveedor from '../models/Proveedor';
export default {
export default {
Gasto: {
proveedor: ({ proveedor }) => Proveedor.findById(proveedor).exec()
},
Query: {
gastos: () => Gasto.find().exec(),
gasto: (_, { id }) => Gasto.findById(id).exec()
},
Mutation: {
crearGasto: (_, input) => Gasto.create(input).exec(),
actualizarGasto: (_, input) => (_, { id: _id, ...input }) =>
Gasto.findOneAndUpdate({ _id }, input, { new: true }).exec(),
eliminarGasto: (_, { id: _id }) => Gasto.findOneAndDelete({ _id }).exec()
}
}
请注意,actualizarGasto
的解析器必须是
actualizarGasto: (_, { id: _id, ...input }) => Gasto.findOneAndUpdate({ _id }, input, { new: true }).exec()
完成。。。没有改变。请参阅链接帖子中提供的答案。您还可以为每个
id
字段添加一个解析器,如obj=>obj.\u id.toString()