Netlify 函数在控制台日志之前未完成

Netlify Function Not Completing Before Console Log

我一直在编写一个脚本,使用 pdf2base64 npm 包将从表单上传的 PDF 转换为 Base64 字符串以上传到 api。

我从上传的 PDF 中提取 url 并将其传递到我上面提到的包中,以便将其转换为正确的格式。

我的代码看起来像这样:


const pdf2base64 = require('pdf-to-base64')

const createPayload = (name, email, pdf) {
    return {
        firstName: name,
        email: email,
        pdf: {
            name: pdf.filename,
            mimeType: pdf.type,
            fileContent: '', // This will be replaced with a base64 string
        }
    }
}

exports.handler = async function( event, context ) {

    const formData = JSON.parse(event.body).payload

    if (formData.form_name == 'pdf-form') {

        console.log("Processing PDF...")
        const submission = createPayload(formData.data)
        const pdfUrl = formData.data.resume.url

        pdf2base64(pdfUrl)
            .then( (response) => {
                const result = response;
                submission.pdf.fileContent = result;
                console.log(submission)
                return response
            })
            .catch( (error) => console.log(error))

    }

}

但是,当我 运行 脚本时,我的控制台只记录以下内容。

9:43:59 AM: 2021-01-26T07:43:59.806Z    608332cc-be83-4243-b986-05d6e7e5b0f0    INFO    Processing PDF...
9:43:59 AM: Duration: 71.86 ms  Memory Usage: 70 MB Init Duration: 132.10 ms    

如您所见,“正在处理 PDF...”后的任何日志都没有显示。我做错了什么?

您需要在异步函数的上下文中使用 await 以便等待 pdf2base64() 函数调用的结果。否则 main 函数将比您的 pdf2base64 函数更快完成。

exports.handler = async function( event, context ) {

  const formData = JSON.parse(event.body).payload

  if (formData.form_name == 'pdf-form') {

    console.log("Processing PDF...")
    const submission = createPayload(formData.data)
    const pdfUrl = formData.data.resume.url

    
    try {
      const result = await pdf2base64(pdfUrl);
      return result;
    } catch(error) {
      console.log(error);
    }
  }
}

您可以在 async/await 阅读更多内容: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await

根据经验。如果您将函数标记为异步,只需使用 await 而不是“then/catch”。也使代码更容易阅读。如果你有更复杂的流程,就没有嵌套地狱。只是看起来线性的代码。