Я борюсь с некоторыми функциями ожидания/асинхронности. Итак, у меня есть следующая функция, которая pdfData
никогда не отличается от undefined
; Что я хочу сделать, так это то, что после всего процесса создания файла PDF подпишите его с помощью s3, загрузите его на s3, а затем удалите из временной папки, чтобы вернуть статус и URL-адрес для загрузки.
Может ли кто-нибудь сообщить мне, что мне не хватает?
const pdfData = await pdf
.create(content, options)
.toFile(`./src/services/temp/${fileName}`, async function(error, result) {
if (error) return console.info(error);
const file = result.filename;
// requestSignS3
const awsSign = await signS3(
`statements/${fileName}`,
"application/pdf"
);
// upload document to S3
const uploadStatus = await uploadDocumentToS3(awsSign, file);
// delete file from temp folder
fs.unlink(file, err => {
if (err) throw err;
});
// set data to return
const data = {
status: uploadStatus,
url: awsSign.url
};
return data;
});
console.info(pdfData);
да, вся эта функция внутри try catch
?? Try/catch не является асинхронной функцией
Да, извините, попытка catch завернута в асинхронную функцию.
Я вижу рецепт обещания (или асинхронного ожидания), смешанный с рецептом обратного вызова. Не надо.
toFile
возвращает обещание? Если это так, то мы почти уже там:const pdfFile = await pdf
.create(content, options)
.toFile(`./src/services/temp/${fileName}`);
const pdfData = await /* everything async you want to do with pdfFile goes there */(pdfFile);
toFile
не возвращает промис, вам нужно промисифицировать его либо с помощью библиотеки promisify
, либо вручную. В основном это будет выглядеть так:const toFilePromise = new Promise(function(reject, resolve) => {
pdf.create(content, options)
.toFile(`./src/services/temp/${fileName}`, function(error, result) {
if (error) {
reject(error);
} else {
resolve(result);
}
})
});
Теперь toFilePromise
— это то, чего можно ожидать. После этого вы можете извлечь имя файла, await signS3(
и т. д.
поэтому я использую html-pdf
для рендеринга руля в pdf и .toFile
я вижу, что это занимает два параметра export interface CreateResult { toBuffer(callback: (err: Error, buffer: Buffer) => void): void; toFile(callback: (err: Error, res: FileInfo) => void): void; toFile(filename?: string, callback?: (err: Error, res: FileInfo) => void): void; toStream(callback: (err: Error, stream: fs.ReadStream) => void): void; }
Отредактировано с более подробной информацией.
Просто вопрос проверки работоспособности ... ваш
await pdf ...
внутри асинхронной функции?