![](/img/trans.png)
[英]How to get file size before upload on s3 bucket in nodeJs + sequelize+graphql?
[英]how to resolve async s3 resolver upload on nodejs + graphql?
我想要做的是首先上傳圖像,然后將鏈接保存到數據庫中的用戶。
這是我的 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 構建 function 解析器?
您應該從解析器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-wrapper;
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
};
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.