我正在使用Node js应用程序,该应用程序通过用户ID(使用pdfkit)创建pdf,使用用户数据填充,然后使用Google Drive API上载到Google Drive。客户端正在获取该文件的URL。我的问题是,当我上传一次后,它可以完美运行。但是,当我尝试再次执行此操作时,该文件已上传但为空。如果我重新启动服务器,它将再次起作用。
在第二次尝试时也可以创建pdf,唯一的问题是第二次创建/上传。我曾尝试使文件名动态化,但这无济于事。仅服务器重新启动有效。谢谢你。
创建pdf的功能
const createPdf = async (req, res, missions) => {
try {
const { _id } = req.user;
const pdfPath = path.join('data', 'pdf', _id + '.pdf');
let doc = new PDFDocument({ margin: 50 });
doc.pipe(fs.createWriteStream(pdfPath));
generateInnerPdf(doc, missions);
doc.end();
return { success: true };
} catch (err) {
return { success: false };
}
};
在Google云端硬盘上上传并检索url的功能
exports.uploads = (_id) => {
return new Promise((resolve) => {
const auth = new google.auth.JWT(
credentials.client_email,
null,
credentials.private_key,
scopes
);
const drive = google.drive({ version: 'v3', auth });
var folderId = 'xxxxxxxxxxx';
const pdfPath = path.join('data', 'pdf', _id + '.pdf');
var fileMetadata = {
name: `${_id}.pdf`,
parents: [folderId],
};
var media = {
mimeType: 'application/pdf',
body: fs.createReadStream(pdfPath),
};
drive.files.create(
{
resource: fileMetadata,
media: media,
fields: 'id',
},
(error, result) => {
resolve({
fileUrl: `https://drive.google.com/file/d/${result.data.id}/view?usp=sharing`,
});
}
);
});
};
我的pdf控制器
exports.create = async (req, res) => {
try {
const { missions } = await getMissions(req.user._id);
const { success } = await createPdf(req, res, missions);
if (success) {
googleApi.uploads(req.user._id).then((result) => {
res.status(200).send(result);
});
} else {
res.status(422).send(err);
}
} catch (err) {
console.log(err);
res.status(422).send(err.message);
}
};
编辑:当我再次解决诺言时应该有问题吗?
设置超时时固定
if (success) {
setTimeout(function () {
googleApi.uploads(req.user._id).then((result) => {
res.status(200).send(result);
});
}, 500);