Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 猫鼬&x2B;GraphQL无法填充模型_Javascript_Mongodb_Mongoose_Graphql_Apollo Server - Fatal编程技术网

Javascript 猫鼬&x2B;GraphQL无法填充模型

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, 重要事项:浮动,

嗯,我知道关于这个问题有很多问题,但他们的解决方案对我都不起作用,或者我找不到发生了什么

我有一个在本地主机上运行Apollo server+Mongoose的后端服务器。我的问题是我无法填充或创建集合,因为我得到:

错误
“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()