当我们尝试为我们获得的方法运行RPC命令时,我似乎无法弄清楚问题。它在本地工作但不在实时Linux服务器上工作。 TypeError:无法读取属性’method’…
如果第一个try / catch块中出现错误,您的代码就会中断,这是您身边的语义错误。
try { var body=JSON.parse(req.body.curl); } catch(err) { res.send({msg: 'invalid command', error: err}); }
1. JS中的可变吊装
检查js中变量hoising的主题: https://developer.mozilla.org/en-US/docs/Glossary/Hoisting
简而言之,基于您的示例,这意味着JS编译器将在您的内部创建一个名为body的变量 岗位 函数最顶层的函数,其初始值为undefined。发生这种情况是因为你使用了var关键字,而不是const / let。
只有在这种情况下 JSON.parse() 正常工作,将设置body变量的值。如果出现这种情况失败(看起来似乎发生了这种情况)或者出现错误,则正文将永久保持未定义状态,这意味着您无法访问其属性(如方法),因为它不是对象。
JSON.parse()
的 解决方案取决于您希望在此实现的目标: 强>
这里重构的一个例子:
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中,无需在此处专门检查未定义的主体。