当前位置: 首页 > 知识库问答 >
问题:

嵌套JSON。JS try/catch未捕获解析错误和JS对象遍历错误,导致服务器崩溃

璩无尘
2023-03-14

我在Express中有这个POST路由处理程序。我担心的是,使用一个大的try/cat块不能正确地捕获其中发生的所有错误。

在下面唯一的try/cat块中,我尝试访问嵌套的本机JS属性-即parsed.template.list.push(listItem);

所以我试图将一个对象推送到嵌套属性的数组上。如果模板不存在,它将导致运行时错误,但这并不被try/catch所捕获,服务器只是完全停止,并且没有发送JSON响应。

有没有办法改进我的代码——我需要在我的代码中放入无数的尝试/捕捉来试图心不在焉地保护一切吗?

 POST: function (req, res, next) {

            var incidentId = req.body.incident_id;

            if (incidentId) {   
                csDataHelper.getAccountNumWithIncidentCorrelationID(incidentId, function (err, response, body) {

                    if (err) {
                        return res.json({error: err.toString()});
                    }


                    try {  // big try/catch starts here

                        var body = JSON.parse(body);
                        var result = csDataHelper.parseInfoFromCSResponse(body);

                        if (!(result instanceof Error)) {

                            var accountNum = result.accountNum;
                            var homePhone = result.homePhone;
                            var altPhone = result.altPhone;

                            var absPath = path.resolve(nconf.get('globalRoot').concat('/json_response_templates/pay_by_phone.json'));
                            fs.readFile(absPath, 'utf8', function (err, jsonTemplate) {
                                if (err) {
                                    res.json({'error': err.toString()});
                                }
                                else {
                                    var str = jsonTemplate.replace('${accountNumber}', accountNum).replace('${incidentId}', incidentId);
                                    var parsed = JSON.parse(jsonTemplate);
                                    if (homePhone) {
                                        var listItem = {
                                            "label": homePhone,
                                        };
                                        parsed.template.list.push(listItem);
                                    }
                                    if (altPhone) {
                                        var listItem = {
                                            "label": altPhone,
                                        };
                                        parsed.template.list.push(listItem);
                                    }
                                    res.json(parsed);
                                }
                            });
                        }
                        else {
                            return res.send({error: 'no accountNumber sent to Baymax from Contextstore ->' + result});
                        }
                    }
                    catch (err) {
                        return res.json({error: err.toString()});
                    }

                });
            }
            else {
                res.send({error: 'null/empty incident_id posted to Baymax'});
            }
        }
    }

当try/catch中的某些代码遇到错误时,try/catch块不会捕获该错误。具体来说,我知道在某些情况下“parsed.template.list.push(listItem);”实际上应该是“parsed.list.push(listItem);”,这取决于JSON的性质。

换句话说,在JS中,使用嵌套JSON时是否需要使用嵌套的try/catch。解析调用还是嵌套JS对象属性检索?

坦白地说,这是非常危险的,而且是我在Node中看到的所有事情中最危险的。解析JSON和遍历本机js对象对服务器正常运行时间构成了一些最大的威胁。

如何应对?

共有1个答案

琴镜
2023-03-14

它在parsed.template.list.push(listItem)上崩溃的原因是因为该行在异步函数调用的回调中。

因此,目前最好的选择是在回调中添加一个try-catch,或者添加一个类似if(parsed.template)的条件

 类似资料:
  • 我现在必须学习通过fire base编写移动应用程序web服务。我点击了这个链接:https://firebase-php.readthedocs.io/en/stable/ 在我的核心网站中,我创建web服务文件夹,然后创建我的fire。php文件。这个文件代码在这里, 我得打电话给我的支持档案:https://github.com/kreait/firebase-php/ 但我还是得到了一个:

  • 问题内容: 我目前有这个: test.json看起来像这样: 我越来越: 如何更改它,以便无论我拥有多少嵌套值,它都将循环遍历所有嵌套项目? 所以对于上面的例子,我会得到 问题答案: 您可以创建一个递归循环函数,但是会遇到一个问题:当属性是对象时,因为没有字符串,所以没有文本可显示。因此,您将得到: 因为while 是为项目#2显示的字符串,所以它是为项目#1显示的对象。 无论如何,这就是我组成的

  • 嗨,我是一个初学者,正在创建简单的wordpress模板。在我的函数中,除了粗体的代码行之外,其他一切都可以工作。php文件(wp_enqueue('jquery');)。当我排除它时,错误消失了,但我在查看源代码时没有看到wordpress添加的JQuery。不确定这是代码问题还是Jquery版本问题。我尝试添加JQuery迁移插件,但仍然出现相同的错误。我在本地机器上运行所有这些由拉拉贡设置。

  • 问题内容: 我在Angular JS接收错误时遇到问题:未捕获的错误:[$ injector:modulerr]。我的JS文件外观 我还包括了angular-route-js Angular文档说问题出在http://docs.angularjs.org/api/ngRoute 问题答案: 尝试添加以下内容:

  • 问题内容: 我必须遍历json数组对象。 它具有以下结构。 基本上我在做的是prod_1是产品的名称,并且prod_1的版本列表已填充在其中。 所以现在我想要的是产品的名称以及它的版本。 问题在于可能有很多产品和该产品下的许多版本。所以我需要可以在 javascript 中使用适当的循环结构来对其进行处理。 最好将循环将产品名称存储在一个变量中,将版本存储在另一个变量中,因为我需要对产品名称进行一

  • 我有一个现有的spring boot应用程序。我刚刚在、中添加了acturetor。 执行器工作有响应代码错误 来自日志:看起来spring无法解析某个参数。下面是日志。 019-05-15 14:38:24.747 DEBUG 8964---[nio-8090-exec-3]o.s.web.servlet.dispatcherServlet:GET“/acturet/health”,parame