[编辑-已解决]原始问题中没有的重要信息是此功能正在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函数?
答案 0 :(得分:0)
您是否尝试过像在fs.writeFileSync
中那样不等待缓冲区功能来进行fs.writeFile
吗?