Почему эта функция await не запускается после res.end ()? - PullRequest
0 голосов
/ 13 октября 2019

[РЕДАКТИРОВАТЬ - РЕШЕНО] Важная часть информации, которой нет в первоначальном вопросе, заключается в том, что эта функция работает на бессерверной платформе 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?

1 Ответ

0 голосов
/ 13 октября 2019

Вы пытались сделать fs.writeFileSync без ожидания функции буфера, как вы делаете в fs.writeFile?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...