@AndrewRusinas

Can't set headers after they are sent?

Ошибка такая возникает когда несколько раз вызывается res, я знаю. Но хоть убейте, глаз замылился и я не вижу где это происходит. Чуть не разнёс себе комп от бомбёжки.

Ошибка возникает на строке между двумя консоль логами ближе к концу кода

router.post('/user/:_id/uploads/croppedAvatar', async (req, res) => {
    let base64String = req.body.data
    const { _id } = req.params
    let token = req.headers.token ? JSON.parse(req.headers.token) : null
    if (!token) return res.status(403).send('В доступе отказано')

    // Проверка доступа
    let checkAccess
    try {
        checkAccess = await Helpers.checkUser(token, _id)
    } catch (error) {
        return res.status(500).send('Ошибка при проверке пользователя')
    } 

    // Если сервис проверки доступа вернул ошибку
    if (checkAccess.error) {
        console.error(checkAccess.error)
        return res.status(checkAccess.error.status).send(checkAccess.error.message)
    }

    const { path, extention } = req.headers
    const filename = randomstring.generate()

    const fullPath = `${path}/${filename}.${extention}`
    const baseUrl = process.env.NODE_ENV === 'production' ? 'boevoy_url' : 'http://localhost:8081'
    const url = `${baseUrl}/static/${_id}/avatars/${filename}.${extention}`

    // Удаляем заголовок
    let base64Image = base64String.split(';base64,').pop()

    try {
        fs.writeFile(fullPath, base64Image, { encoding: 'base64' }, err => {
            if (err) return res.status(500).send(`Ошибка сохранения файла: ${err}`)
            else return
        });
    } catch (error) {
        const err = {
            desc: 'Ошибка сохранения обрезанного аватара',
            error: error.message
        }
        console.error(err)
        return res.status(500).send(err)
    }
    
    try {
        await User.findByIdAndUpdate(_id, {
            avatar: url
        })
        console.log('Тут работает')
        res.send('Обрезанный аватар успешно загружен')
        console.log('А тут уже нет')
    } catch (error) {
        const err = {
            desc: 'Ошибка добавления обрезанного аватара в профиль пользователя',
            error: error.message
        }
        console.error('сука', err)
        return res.status(500).send(err)
    }
})
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
думаю проблема тут:
fs.writeFile(fullPath, base64Image, { encoding: 'base64' }, err => {
            if (err) return res.status(500).send(`Ошибка сохранения файла: ${err}`)
            else return
        });


так как после этого куска кода не дожидаясь результата выполняется следом идущий код. Таким образом возможна ситуация, при которой send в этом куске кода выполнится уже после send-а в последующем коде

попробуйте заменить этот код на:
const promise = new Promise(resolve, reject)=>{
   fs.writeFile(fullPath, base64Image, { encoding: 'base64' }, err => {
      if (!err) return resolve(true);
      
      res.status(500).send(`Ошибка сохранения файла: ${err}`)
      return reject(false);
   });
});
const isWrite = await promise;
if(!isWrite) return;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы