(узел: 23) UnhandledPromiseRejectionWarning: Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту - PullRequest
0 голосов
/ 28 января 2019

Я создаю приложение, и когда я пытаюсь загрузить изображение, оно выдает эту ошибку в консоли: (узел: 23) UnhandledPromiseRejectionWarning: Ошибка [ERR_HTTP_HEADERS_SENT]: Невозможно установить заголовки после их отправки клиенту.Как я могу решить эту проблему?

Моя выборка:

let formData = new FormData();
formData.append('arquivo', document.querySelector('input[name="arquivo"]').files[0])
formData.append('candy', candy)
formData.append('theme', document.getElementById('candytheme').value)

fetch('https://nodemae.herokuapp.com/candy', { method: 'post', headers: {'x-auth-token': window.sessionStorage.getItem('token') }, body: formData}).then

Моя серверная часть:

async store(req, res) {
    let candy= req.body.candy;
    let name= uniqid(doce+'-')+'.jpg';
    let route= `/img/${doce}/`;
    let theme= req.body.theme;
    let sampleFile = req.files.arquivo;
    sampleFile.mv(`./public${route}${name}`, function(err){
        if (err) {
            return res.send(err)
        }
    });
    const candy = await Candy.create({
        name: name,
        candy: candy,
        route: route,
        theme: theme
    });

    return res.json(candy);
},

Return res.json (candy);возвращает это: {"errno": - 2, "code": "ENOENT", "syscall": "open", "path": "./ public / img / paomel / paomel-q6zynjrg8w45y.jpg"}

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Произошла ошибка при выполнении sampleFile.Другие части кода должны ждать, пока sampleFile не закончится.Таким образом, у вас есть две ошибки: "errno":-2,"code":"ENOENT","syscall":"open","path":"./public/img/paomel/paomel-q6zynjrg8w45y.jpg" (потому что он не может найти файл) и вторая Cannot set headers after they are sent to the client... (потому что ваш код не обрабатывает ошибку и следует до окончательного return res.json(candy); Try:

async store(req, res) {
  let candy= req.body.candy;
  let name= uniqid(doce+'-')+'.jpg';
  let route= `/img/${doce}/`;
  let theme= req.body.theme;
  let sampleFile = req.files.arquivo;
  sampleFile.mv(`./public${route}${name}`, async function(err) {
      if (err) {
        res.send(err)
      } else {
        const candy = await Candy.create({
          name: name,
          candy: candy,
          route: route,
          theme: theme
        });

        res.json(candy);
     }
   });
}

Вы также можете использовать then, без async и await:

store(req, res) {
  let candy= req.body.candy;
  let name= uniqid(doce+'-')+'.jpg';
  let route= `/img/${doce}/`;
  let theme= req.body.theme;
  let sampleFile = req.files.arquivo;
  sampleFile.mv(`./public${route}${name}`, function(err) {
      if (err) {
        res.send(err)
      } else {

        Candy.create({
          name: name,
          candy: candy,
          route: route,
          theme: theme
        })
        .then(function(candy) {
          res.json(candy);
        })
        .catch(function(err) {
          console.log(err);
        });  
     }
   });
}

Попробуйте использовать абсолютный путь здесь /public${route}${name} для загрузки файла, поскольку пакет fileupload не использует относительные пути.

0 голосов
/ 28 января 2019

Вы получаете эту ошибку из-за этой функции обратного вызова

 sampleFile.mv(`./public${caminho}${nome}`, function(err){
    if (err) {
        return res.send(err)
    }
});

Ваш код отправляет ответ от res.json(candy); во время синхронной работы, но когда запускается асинхронный обратный вызов, вы получаете ошибку и `returnres.send (err)

Решение

Попробуйте этот код

async store(req, res)
{
try {
    let doce = req.body.doce;
    let nome = uniqid(doce+'-')+'.jpg';
    let caminho = `/img/${doce}/`;
    let tema = req.body.tema;
    let sampleFile = req.files.arquivo;
    await sampleFile.mv(`./public${caminho}${nome}`)
    const candy = await Candy.create({
            nome: nome,
            doce: doce,
            caminho: caminho,
            tema: tema
        });

        return res.json(candy);
    });
}catch (err) {
    return res.send(err)
}}
...