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

javascript-使用Google Drive API创建文件时,文件内容为空

(javascript - When creating files using Google Drive API the file content is empty)

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

我正在使用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);
  }
};

编辑:当我再次解决诺言时应该有问题吗?

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

设置超时时固定

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