首页 > 解决方案 > 使用 Google Drive API 创建文件时,文件内容为空

问题描述

我正在开发节点 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 };
  }
};

在谷歌驱动器上上传和检索网址的功能

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

编辑:当我再次解决承诺时应该是一个问题吗?

标签: javascriptnode.jsexpressgoogle-drive-api

解决方案


设置超时时修复

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

推荐阅读