2017-02-10 17 views
1

Я новичок в узле, и у меня есть простая ситуация, когда я отправляю конечную точку в узле/экспресс-приложении. Вопрос заключается в том, что я получаю:Отказ от необработанного обещания - Ошибка: не удается установить заголовки после их отправки

POST /api/v2/user 500 25.378 ms - 54 
(node:19024) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: Can't set headers after they are sent. 
(node:19024) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 

Соответствующий код, который я имею, который генерирует это:

router.post('/', (req, res, next) => { 
    return authHelpers.createUser(req, res) 
    .then((user) => { 
     return localAuth.encodeToken(user[0]); 
    }) 
    .then((token) => { 
     res.status(201).json({ 
     status: 'success', 
     message: 'User Created', 
     token: token 
     }); 
    }) 
    .catch((err) => { 
     res.status(500).json({ 
     status: 'error' 
     }); 
    }); 
}); 

, а затем:

function createUser(req, res) { 
    return handleErrors(req) 
    .then(() => { 
     const salt = bcrypt.genSaltSync(); 
     const hash = bcrypt.hashSync(req.body.password, salt); 
     return knex('users') 
     .insert({ 
      email: req.body.email, 
      first_name: req.body.first_name, 
      last_name: req.body.last_name, 
      username: req.body.username, 
      password: hash 
     }) 
     .returning('*'); 
    }) 
    .catch((err) => { 
     res.status(410).json({ 
     status: err.message 
     }); 
    }); 
} 

function handleErrors(req) { 
    return new Promise((resolve, reject) => { 
    if (req.body.username.length < 6) { 
     reject({ 
     message: 'Username must be longer than 6 characters' 
     }); 
    } else if (req.body.password.length < 6) { 
     reject({ 
     message: 'Password must be longer than 6 characters' 
     }); 
    } else { 
     resolve(); 
    } 
    }); 
} 

Я знаю, что если я удалю res.status (500) .json ({status: 'error'});, то ошибка исчезает, но я не уверен, что это правильно.

Любой ключ к тому, что именно является моей ошибкой и как исправить?

+0

Я забыл упомянуть об этом сообщении об ошибке, когда имя пользователя, пароль недостаточно длинны или имя пользователя уже существует в базе данных. –

ответ

2

Вы пытаетесь отправить ответ дважды. Во-первых, когда ловить ошибку

res.status(410).json({ 
    status: err.message 
    }); 

И затем после улова, обещание цепи продолжается по обычному маршруту до:

return localAuth.encodeToken(user[0]); 

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

res.status(500).json({ 
    status: 'error' 
    }); 

лог консоли, которая была брошена ошибка в последней части, я довольно сюр e это что-то вроде

TypeError: Cannot read property '0' of undefined