开发者问题收集

处理 Node.js 中的异常并将错误输出发送到 HTML

2020-05-24
667

我有一个函数,如果出现错误,控制台会记录错误,我希望将相同的数据发送回 HTML <div><div> 必须仅在出现错误时加载并向用户显示错误消息。

app.js

console.log('Pulling Image from DockerHub\n');
const result1 = cp.execSync('docker pull mongo:'+version);
console.log(result1.toString());

假设上述代码生成一个错误,我希望使用 jQuery AJAX 获取 HTML 上的数据。

index.html

<div id="errorReport"></div>

<script type="text/javascript">
        $(document).ready(function(){     
            $.ajax({
                    url: "http://localhost:8090/api/route1",
                    type: 'POST',
                    dataType:'json', 
                    success: function(res) {
                        console.log(res);
                    }
                });    
            });                   
</script>

需要处理上述子进程 (app.js) 中的错误异常,并且仅当存在错误时才在 index.html 上呈现数据。如果 cp 没有返回任何错误,则无需在 index.html 上呈现任何数据。

更新: 假设在这里 const result1 = cp.execSync('docker pull mongo:'+version); 我给出了错误的版本值,子进程失败。根据 execSync 语法,我无法使用回调函数来确定错误。

现在控制台确实显示了一些错误消息

Error response from daemon: manifest for mongo:a not found: manifest unknown: manifest unknown
child_process.js:660
    throw err;
    ^

现在,如果我希望在我的 HMTL <div> 上显示相同的消息,我该怎么办?

2个回答

关键是 捕获 服务器上的错误并将其返回到 HTTP 响应中。您不必使用 .json({ ... }) ,但它往往很方便。

try {
  cp.execSync(`docker pull mongo:'+version`);
  res.status(200)
} catch (error) {
  // catch the error and return it's message to the client
  res.status(500).json({ error: error.message })
}

error.message 往往具有您描述的消息类型,但您也可以访问其他字段,如堆栈跟踪等。由于服务器返回 statusCode 500,这将触发 error 回调,因此您需要将该处理程序添加到您的请求中,然后将消息添加到 DOM。

$.ajax({
    url: "http://localhost:8090/api/route1",
    type: 'POST',
    dataType:'json', 
    success: function(res) {
        console.log(res);
    },
    error: function(xhr, textStatus, errorThrown) {
      // parse the JSON from the server
      const json = JSON.parse(xhr.responseText);
      // finally, set the div's text to the error
      $("#errorReport").text(json.error);
    }
  });    
});
Justin Bretting
2020-05-24

您可以尝试这个 -

<div id="errorReport"></div>

<script type="text/javascript">
        $(document).ready(function(){    
            $("#errorReport").hide();
            $.ajax({
                    url: "http://localhost:8090/api/route1",
                    type: 'POST',
                    dataType:'json', 
                    success: function(res, status) {
                        if(status === 500){
                           $("#errorReport").show();
                        }
                        console.log(res);
                    }
                });    
            });                   
</script>

在您的服务器上 -

try {
  cp.execSync(`docker pull mongo:'+version`);
  res.status(200)
 } catch (error) {
  //catch the error here and handle it accordingly by sending error response to client
 res.status(500)
 }
Vimal Munjani
2020-05-24