我正在构建GraphQL服务器,并且其中一个解析器出现一些奇怪的行为。第一次运行突变时,它返回null,但是当我使用日志记录控制台时,它清楚地表明,在尝试返回该对象之前,Mongoose已将该对象返回。
解析器:
setView(error, { name, author, data }) {
if (error) return console.error(error);
console.log(`Creating new view named: ${name}`);
let newView = new View({ name: name, author: author, data: data });
newView.save();
console.log("View created");
console.log(View.findOne({ name: name }));
return View.findOne({ name: name });
}
控制台日志:
创建名为testView5的新视图
创建视图
model.Query {_mongooseOptions:对象,mongooseCollection: NativeCollection,模型:,模式:模式,操作:“ findOne”,…}
创建名为testView5的新视图
创建视图
model.Query {_mongooseOptions:对象,mongooseCollection: NativeCollection,模型:,模式:模式,操作:“ findOne”,…}
突变:
mutation {
setView(
name: "testView7",
author: "Bob",
data: [
"First Column",
"Second Column",
"Third Column"
]) {
name
}
}
初始回报:
{
"data": {
"setView": null
}
}
后续返回(再次运行相同的突变):
{
"data": {
"setView": {
"name": "testView7"
}
}
}
当前,我想知道这是否与findOne的返回方式有关,但是我无法理解如果第二次工作会怎样。
答案 0 :(得分:1)
乔·沃纳(Joe Warner)在上面说保存是异步的时是正确的。解决方案是使函数等待来自保存的承诺,如下所示:
async setView(error, { name, author, data }) {
if (error) return console.error(error);
console.log(`Creating new view named: ${name}`);
let newView = new View({ name: name, author: author, data: data });
var result = await newView.save();
console.log(`Created view: ${result}`);
return result;
}