首页 > 解决方案 > Mongoose.findOneAndUpdate 无法运行

问题描述

所以我正在使用graphql服务器,我正在尝试对facebook的服务器进行异步/等待外部调用。

问题是所有这些信息都会返回,但不会保存到数据库中。我怎么知道它会回来?如果我使用findOne而不是findOneAndUpdate我可以console.log所有信息并成功查看它,但是一旦我切换回来,我什至不会收到错误。

我查看了 mongoose 文档并尝试findOneAndUpdate正确应用,但它只是嘲笑我没有错误,它什么也没做。

如果有人可以给我一些建议,那么这里的任何方式都是我的代码,我将不胜感激。

第一组是findOne我知道可以 100% 使用但不保存或更新文档的代码。

第二个是当我尝试使用FindOneAndUpdate.

getFacebookPageID: {
      type: FacebookType,
      description: 'Gets all the content we want from facebook once a user has granted permissions',
      args: {
        id: { type: GraphQLString },
        accessToken: { type: GraphQLString },
        facebook: { type: InputFacebookType }
      },
      resolve: (parent, args) => User.findOne({ _id: args.id }, async (err, docs) => {
        console.log('next step is getcontent');
        // const clientId = process.env.FACEBOOK_ID;
        // const reDirectFBUri = process.env.FACEBOOK_ID_URI;
        const { accessToken } = docs.tokens.find((item) => item.kind === 'facebook');
        const userId = docs.facebookId;

        console.log(userId);
        const getFBaccounts = `https://graph.facebook.com/${userId}/accounts?access_token=${accessToken}`;
        let pages = null;
        await axios.get(getFBaccounts)
          .then((response) => {
            pages = response.data.data;
            // this above line is all the fb pages user has give us access to
            console.log('pages', response.data.data);
            const query = { _id: args.id, };
            console.log('This should be object id', query);
            User.updateOne(query, {
              pages,
            }, (err, docs) => {
              console.log('Any errors here are problems with saving!', err, docs);
            });
          })
          .catch((err) => console.log(err));


        return FacebookType;
      }
      ),
    },

我也在下面尝试过这个,甚至根本不会控制台记录任何内容。这是我试图使用findOneAndUpdate

getFacebookPageID: {
type: FacebookType,
description: 'Gets all the content we want from facebook once a user has granted permissions',
args: {
  id: { type: GraphQLString },
  accessToken: { type: GraphQLString },
  facebook: { type: InputFacebookType }
},
resolve: (parent, args) =>  User.findOneAndUpdate({ _id: args.id },{ pages:  async (err, docs) => {
  console.log('next step is getcontent');

  const { accessToken } = docs.tokens.find((item) => item.kind === 'facebook');
  const userId = docs.facebookId;

  console.log(userId);
  const getFBaccounts = `https://graph.facebook.com/${userId}/accounts?access_token=${accessToken}`;
  let pages = null;
  await axios.get(getFBaccounts)
    .then((response) => {
      pages = response.data.data;

      console.log('pages', response.data.data);

    })
    .catch((err) => console.log(err));


  return FacebookType;
}
},
{new: true}
),
},

标签: node.jsmongooseasync-awaitgraphql

解决方案


您将 async/await 与 Promise 混合使用。您应该选择一种方法(我建议 async/await);

resolve: async (parent, args) => {
try {
  //get user
  const user = await User.findById(args.id); //user is mongooose instance - https://mongoosejs.com/docs/api.html#document_Document-save
  const { accessToken } = user.tokens.find((item) => item.kind === 'facebook');
  const userId = user.facebookId;
  const getFBaccounts = `https://graph.facebook.com/${userId}/accounts?access_token=${accessToken}`;

  //get pages
  const fbResponse = await axios.get(getFBaccounts);

  //use mongoose prototype method "save" to update the user
  user.pages = fbResponse.data.data;
  await user.save();
  return user;
} catch(e) {
   console.log(e);
 }
}

推荐阅读