gpt4 book ai didi

javascript - 如何解决nodejs + graphql上的异步s3解析器上传?

转载 作者:行者123 更新时间:2023-12-04 09:46:09 26 4
gpt4 key购买 nike

我想要做的是先上传图像,然后将链接保存到数据库中的用户。

这是我的 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 和成功。我如何使用 s3 构造函数解析器?

最佳答案

您应该return new Promise来自您的解析器,而不是制作它 async这样你就可以明确 resolve()reject()从嵌套回调中。

resolve: (_root, args, { user, prisma }) => {
return new Promise((resolve, reject) => {
s3.putObject(params, async (error, data) => {

if (error) {
return reject({
message: error.message,
success: false
});
}

try {
await prisma.user.update();

return resolve({
message: "Success",
success: true
});
} catch (e) {
return reject({
message: e.message,
success: false
});
}

});
});
};

如果您想留在 async/await范式,围绕 s3.putObject 制作实用程序/ promise 包装器;

function putObject(...params) {
return new Promise((resolve, reject) => {
s3.putObject(...params, async (error, data) => {
if (error) {
return reject(error);
}

return resolve(data);
});
});
}

resolve: async (_root, args, { user, prisma }) => {
try {
const response = await putObject(params);

await prisma.user.update();

return {
message: "Success",
success: true
};
} catch (error) {
return {
message: error.message,
success: false
};
}
};

关于javascript - 如何解决nodejs + graphql上的异步s3解析器上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62102714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com