【问题标题】:Express/Node.js Page Refresh IssueExpress/Node.js 页面刷新问题
【发布时间】:2018-12-12 23:10:45
【问题描述】:

我是使用服务器进行 Web 开发的初学者(仅在 uni 上过一门课程)。我有一个与 GET 请求有关的奇怪问题,如果我刷新太多次,它就会停止发送。这是 npm start 工作时的输出:

GET / 304 0.350 ms - -
GET /stylesheets/styles.css 404 28.359 ms - 1132
GET /javascripts/scripts.js 304 0.244 ms - -
GET /favicon.ico 404 11.692 ms - 1132
GET /skaterSummary.json 304 51.770 ms - -

垃圾邮件刷新很多次后,输出变成这样:

GET /skaterSummary.json - - ms - -
GET / 304 0.676 ms - -
GET /stylesheets/styles.css 404 28.628 ms - 1132
GET /javascripts/scripts.js 304 0.599 ms - -
GET /favicon.ico 404 20.098 ms - 1132

代码:routes/index.js

// Database Testing
router.get('/skaterSummary.json', function(req, res, next) {
    req.pool.getConnection(function(err, connection) {
        if (err) throw err;
        var query = "SELECT * from Summary;";
        connection.query(query, function(err, results) {
            res.json(results); // send response
        });
    });
});

代码:scripts.js

$(document).ready(function() {
    'use strict';

    let xhttp = new XMLHttpRequest();

    xhttp.open('GET', 'skaterSummary.json', true);
    xhttp.setRequestHeader('Content-type', 'application/json');
    xhttp.send();

    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            console.log("Success");
            console.log(JSON.parse(xhttp.responseText));
        }
    };
});

感谢任何指点:)

【问题讨论】:

  • 什么停止发送? skaterSummary.json?你检查浏览器控制台了吗?
  • 是的,skaterSummary.json 停止发送。只有当它发送时,我才能在浏览器控制台中获得 json。
  • 我会将if (err) throw err; 添加到您的connection.query 回调中。
  • 我认为这解决了它!工作了一段时间,但同样的事情又发生了:(
  • 它不应该修复任何东西,它应该在发生错误时显示错误,而不是什么都不做。

标签: javascript node.js express web server


【解决方案1】:

所以问题很可能是从任一数据库请求返回的错误,抛出错误(特别是在异步回调中)不会做任何事情,它不会被传播,因此无法处理,这意味着任何待处理请求只会挂起,直到最终超时。

处理此问题的最佳方法是调用next 并将错误传递给 Express,然后您可以添加自己的自定义错误处理程序或利用 Express 中的默认处理程序

router.get('/skaterSummary.json', function(req, res, next) {
  req.pool.getConnection(function(err, connection) {
    if (err) {
      console.error(err); // log the DB error internally
      return next(new Error('Server Error')); // return a client error
    }

    var query = "SELECT * from Summary;";
    connection.query(query, function(err, results) {
      if (err) { 
        console.error(err);
        return next(new Error('Server Error')); 
      }

      res.json(results); // send response
    });
  });
});

【讨论】:

  • 对不起,我不太清楚该怎么做。默认的 Express 错误处理程序是否应该能够处理此错误?因为请求最终仍然停滞不前。我不太确定如何编写自定义的。此外,似乎没有任何关于该错误的控制台消息。
  • @davidhin 默认的 Express 错误处理程序将结束请求,但也刚刚意识到这是一个 AJAX 响应,因此您需要返回 JSON 响应,因此您需要自定义在这种情况下处理程序。但是,如果您说错误为零,那么显然这不是问题,我们在这里谈论多少次刷新?你会耗尽你的数据库连接池吗?即使那样,我仍然会期待一个错误......
  • FWIW,你知道$.get吗?真的会简化您的客户端代码。
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2011-05-13
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多