[РЕДАКТИРОВАТЬ - РЕШЕНО] Важная часть информации, которой нет в первоначальном вопросе, заключается в том, что эта функция работает на бессерверной платформе Zeit Now. Функции Zeit прекращают обработку после res.end
, чтобы сократить время безотказной работы. Это сбивало с толку, потому что console.log
s и другой код запускались после res.end
, но я полагаю, потому что это не занимало время для оценки.
В этой простой функции 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..
}
Теперь файл загружен и оба ФАЙЛАЗАГРУЖЕННЫЕ строки журнала в консоль. Но мне нравится метод sync, потому что он избегает супа обратного вызова.
Поэтому мой вопрос - почему функция await не может запускаться после res.end?