我想要做的是首先上传图像,然后将链接保存到数据库中的用户。
这是我的 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 构建函数解析器?
最佳答案
您应该从解析器返回新的Promise
,而不是使其异步
,这样您可以显式resolve()
或从嵌套回调中拒绝()
。
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/