为什么我的解析器第一次不返回?

时间:2018-06-26 16:09:51

标签: javascript mongoose graphql apollo

我正在构建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的返回方式有关,但是我无法理解如果第二次工作会怎样。

1 个答案:

答案 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;
    }