1

我正在创建一个应用程序并使用http://c9.io环境来开发它。它是一个 NodeJS 应用程序,它提供了一些 REST 端点供客户端应用程序查询。到现在为止,一切都运行良好,今天我观察到的是,对于浏览器向 REST API 发送的 1 个调用,有 2 个请求显示为已接收,并且请求处理程序被调用了 2 次。这减慢了一个请求的响应时间。

在 Chrome 开发人员工具中,它只显示一个发送的请求,但是,我app.use()用来在 Express 中记录传入的请求,它为每个请求打印相同的 2 次。此外,处理程序被调用两次。

这是间歇性发生的,不是每次都发生。我在公司网络后面。由于我在一天中发送了很多请求进行测试,监控程序是否有可能发送请求,因为它发现它很可疑?我没有编辑处理请求的代码。

编辑:按照建议添加处理程序的代码。

app.get('/suggestions/:keyword', function(r, s) {
    sug_db.retrieveSuggestions(r.params.keyword, function(data) {
        s.writeHead(200, {'content-type': 'text/html'});
        s.write(renderSugg({data: data}))
        s.end();
    });
});

app.get('/search/:query', function(r, s) {
    esc_db.search(r.params.query, function(data) {
        s.send(renderResults({query: r.params.query, results:data}));
    });
});

如您所见,它们只是从数据库中获取一些数据并将结果作为 HTTP 响应返回。我使用的模板引擎是 Pug(以前的 Jade)

4

1 回答 1

1

看起来您在问题中包含的代码不会因为运行两次而有罪。但也许有一些代码sug_db.retrieveSuggestionsesc_db.search这样做。

我要做的是:

在您提供的代码中添加一些日志记录,无论是在调用函数之前还是在回调内部:

app.get('/suggestions/:keyword', function(r, s) {
    console.log('*** GET /suggestions/:keyword handler');
    sug_db.retrieveSuggestions(r.params.keyword, function(data) {
        console.log('GET /suggestions/:keyword callback');
        s.writeHead(200, {'content-type': 'text/html'});
        s.write(renderSugg({data: data}))
        s.end();
    });
});

app.get('/search/:query', function(r, s) {
    console.log('*** GET /search/:query handler');
    esc_db.search(r.params.query, function(data) {
        console.log('GET /search/:query callback');
        s.send(renderResults({query: r.params.query, results:data}));
    });
});

(或更改console.log为您使用的任何记录方法)。我会看到实际调用了两次 - 处理程序本身,或回调,或没有。接下来将检查处理程序实际调用的函数:

  • sug_db.retrieveSuggestions()
  • esc_db.search()
  • renderSugg()
  • renderResults()

重要的是要查看两次实际调用的内容,然后检查为什么会发生这种情况。但是,例如,如果您执行以下操作,则可能会发生这种情况:

function badFunction(data, callback) {
  if (something) {
    callback('error');
  }
  callback('ok');
}

代替:

function goodFunction(data, callback) {
  if (something) {
    callback('error');
  } else {
    callback('ok');
  }
}

我希望从处理程序调用的函数可以执行类似的操作来调用回调两次 - 也许他们检查的条件或错误以前没有发生但现在发生了,导致行为发生变化。

于 2016-09-20T12:53:17.613 回答