Ваш код ломается в случае ошибки внутри вашего первого блока try / catch, которая является вашей семантической ошибкой.
try
{
var body=JSON.parse(req.body.curl);
}
catch(err)
{
res.send({msg: 'invalid command', error: err});
}
1.Подъем переменной в JS
Проверьте тему подъема переменной в js: https://developer.mozilla.org/en-US/docs/Glossary/Hoisting
Короче говоря, на вашем примере это означает, что компилятор JS создаст переменную с именем bodyвнутри вашей post функции в самом верху функции, которая имеет начальное значение undefined.Это происходит потому, что вы использовали для него ключевое слово var, в отличие от const / let.
Только в случае правильной работы JSON.parse()
будет установлено значение переменной body.В случае такого сбоя (что происходит с вами, как кажется) или получения ошибки, тело останется неопределенным навсегда, то есть вы не сможете получить доступ к его свойствам, таким как метод, так как это не объект.
Решения зависят от того, чего вы хотите достичь:
- Вы можете поместить оставшуюся часть кода внутрь try / catch aswell
- Вы можете добавить дополнительную проверку телаaswell
- Вы можете немного изменить код, чтобы сделать его более читабельным (что, конечно, всегда субъективно и зависит от стиля кодирования)
Пример рефакторинга здесь:
app.post('/', function(req, res) {
try {
const body = JSON.parse(req.body.curl);
switch (body.method) {
case 'GET':
this.handleGETRequest();
case 'POST':
this.handlePOSTRequest();
default:
this.handleDefault();
}
} catch (err) {
res.send({ msg: 'invalid command', error: err });
}
});
Если вы хотите избежать разбиения на несколько функций, вы можете сделать что-то вроде
app.post('/', function(req, res) {
try {
const body = JSON.parse(req.body.curl);
// Your current else
if(!body.method) {
...code
return; // Will break the execution after this
}
...your normal if/else here with simplified checks now
} catch (err) {
res.send({ msg: 'invalid command', error: err });
}
});
Учитывая, что все обернуто внутри try / catch, нет необходимости специально проверять, что тело здесь не определено.