Javascript 如何解决nodejs+;graphql?

Javascript 如何解决nodejs+;graphql?,javascript,node.js,graphql,Javascript,Node.js,Graphql,我想做的是先上传图片,然后将链接保存到db中的用户 这是我的graphql解析器: resolve: async (_root, args, { user, prisma }) => { .... const params = { Bucket: s3BucketName, Key: fileName, ACL: 'public-read', Body: file.creat

我想做的是先上传图片,然后将链接保存到db中的用户

这是我的graphql解析器:

resolve: async (_root, args, { user, prisma }) => {

        ....

        const params = {
          Bucket: s3BucketName,
          Key: fileName,
          ACL: 'public-read',
          Body: file.createReadStream(),
          ContentType: file.mimetype,
        };
        return s3.putObject(params, async function (error, data) {
          if (error) {
            return {
              message: error,
              success: false,
            };
          } else {
            // user has updated
            if (user.profileImg)
              return prisma.user
                .update({
                  where: { id: Number(user.id) },
                  data: {
                    profileImg: fileName,
                  },
                })
                .then(
                  (response) => {
                    console.log('response: ', response);
                    return {
                      message: 'Success',
                      success: true,
                    };
                  },
                  (error) => {
                    return {
                      message: error,
                      success: false,
                    };
                  }
                );
            else {
              return {
                message: 'Success',
                success: true,
              };
            }
          }
        });
      },

我想做的是从s3返回,但我的问题是,我认为它返回时没有这个解析,返回null,所以emmage和success不会返回。如何使用s3构造函数解析程序?

您应该
从解析程序返回新的承诺
,而不是使其
异步
,这样您可以从嵌套回调中显式地
解析()
拒绝()

resolve:(_root,args,{user,prisma})=>{
返回新承诺((解决、拒绝)=>{
s3.putObject(参数,异步(错误,数据)=>{
如果(错误){
退货拒绝({
消息:error.message,
成功:错
});
}
试一试{
等待prisma.user.update();
返回解析({
信息:“成功”,
成功:真的
});
}捕获(e){
退货拒绝({
信息:e.message,
成功:错
});
}
});
});
};
如果您想继续使用
async/await
范例,请围绕
s3.putObject
制作一个实用程序/承诺包装器

函数putObject(…参数){
返回新承诺((解决、拒绝)=>{
s3.putObject(…参数,异步(错误,数据)=>{
如果(错误){
返回拒绝(错误);
}
返回解析(数据);
});
});
}
解析:异步(_root,args,{user,prisma})=>{
试一试{
常量响应=等待putObject(参数);
等待prisma.user.update();
返回{
信息:“成功”,
成功:真的
};
}捕获(错误){
返回{
消息:error.message,
成功:错
};
}
};

用.then和.catch而不是.then(()=>{})提问。catch(()=>{})我可以用这个吗。然后(res=>{//fulfillment},error=>{//rejection})@gpbaculio是的,
.then()
的第二个参数可以用作异常处理程序。