Warm tip: This article is reproduced from serverfault.com, please click

When creating files using Google Drive API the file content is empty

发布于 2020-11-30 13:41:24

I'm working on node js app that is creating pdf by user id (using pdfkit), fills with user data and then uploads to Google Drive using Google Drive API. Client is getting back URL of this file. My problem is that when I upload it once, it works perfectly. But when I'm trying to do it again, the file uploads but it's empty. If I restart server it works again.

Pdf creation is also fine on the second attempt, the only problem is second create/upload. I have tried making the name of the file dynamic but that did not help. Only server restart works. Thank you.

Function for creating 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 };
  }
};

Function for upload on google drive and retrieve 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`,
        });
      }
    );
  });
};

My pdf controller

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);
  }
};

EDIT: Should be a problem when I'm resolving promise again?

Questioner
vasikpasik
Viewed
0
vasikpasik 2020-12-02 05:52:13

Fixed when setting timeout

 if (success) {
      setTimeout(function () {
        googleApi.uploads(req.user._id).then((result) => {
          res.status(200).send(result);
        });
      }, 500);