为什么此await函数在res.end()之后不运行?

时间:2019-10-13 18:26:32

标签: javascript node.js asynchronous

[编辑-已解决]原始问题中没有的重要信息是此功能正在Zeit Now无服务器平台上运行。 Zeit函数在res.end之后停止处理,以缩短正常运行时间。之所以令人困惑,是因为console.log之后正在运行res.end s和其他代码,但是我认为是因为它不需要花时间进行评估。


在这个简单的Node函数中,为什么await函数没有运行?我res.end很早就希望其余功能可以运行,但它会在await功能处停止。

const fs = require("fs")
const bent = require("bent")
const buffer = bent("buffer")
const file_url = "http://klippr.s3.amazonaws.com/assets/mask.png"

module.exports = async (req, res) => {
  console.log("REQUEST RECEIVED")
  res.end("JOB ACCEPTED")

  console.log("STARTING JOB")
  console.log("BUT NOTHING AFTER THIS RUNS")

  fs.writeFileSync("/tmp/mask.png", await buffer(file_url))

  console.log("FILE DOWNLOADED")
  // do more stuff with the downloaded file..
}

当我调用此函数时,永远不会下载文件,并且FILE DOWNLOADED日志行也不会运行。日志:

REQUEST RECEIVED
STARTING JOB
BUT NOTHING AFTER THIS RUNS

如果我将fs.writeFileSync更改为常规fs.writeFile并使用回调,一切将按预期工作:

const fs = require("fs")
const bent = require("bent")
const buffer = bent("buffer")
const file_url = "http://klippr.s3.amazonaws.com/assets/mask.png"

module.exports = async (req, res) => {
  console.log("REQUEST RECEIVED")
  res.end("JOB ACCEPTED")

  console.log("STARTING JOB")
  console.log("BUT NOTHING AFTER THIS RUNS")

  // fs.writeFileSync("/tmp/mask.png", await buffer(file_url))
  fs.writeFile("/tmp/mask.png", buffer(file_url), () => {
    console.log("FILE DOWNLOADED")
  })

  console.log("FILE DOWNLOADED")
  // do more stuff with the downloaded file..
}

现在,文件已下载,并且FILE DOWNLOADED行都记录到控制台。但是我喜欢sync方法,因为它避免了回调汤。

所以我的问题是为什么在res.end之后不能运行await函数?

1 个答案:

答案 0 :(得分:0)

您是否尝试过像在fs.writeFileSync中那样不等待缓冲区功能来进行fs.writeFile吗?