使用sequelize阻塞其他用户的Nodejs和异步调用mysql

时间:2013-10-12 19:23:22

标签: mysql node.js asynchronous

这是我在这里的第一篇文章,我希望我做得对。 我正在学习我想做的项目的nodejs,并且我正在使用node来编写Web服务。我按照教程进入了一个有效的网络服务,但我必须自己编写连接数据库的部分。问题是,它返回数据,但它也阻止了其他一切。 如果查询1需要20秒,查询2只需要3秒,我调用查询1然后查询2,查询2将仅在查询1完成后显示,阻止所有潜在用户! 这是我的代码的一部分,如果您需要更多,只需询问

这是请求处理程序之一,最后2个参数用于测试。

function start(response){
        console.log("Request handler 'insertHood' was called.");
        response.writeHead(200, {"Content-Type": "text/html"});
        var result = db.execute('select x(country_location), y(country_location), country_name, zoom_level from country', response, "Query 1 ", 10);
    }

这是database.js文件中的函数

function execute(query, response, msg, sleepz) {
  var result = sequelize.query(query)
  .success(function(rows)
    {
      sleep(sleepz);
      response.write(msg + JSON.stringify(rows));
      console.log(msg + (new Date()));
      response.end();
    }
  ).error(function(e) {
      console.log("An error occured", e);
      response.write("there was an error man, yo yoy oy");
      response.end();
    }
  );
}

我明白.success和.error是回调函数,但我似乎无法找到使它们异步的方法,我读到了一个异步库,但我不认为它做我需要的东西,我确定我做的事情错了,这是什么?

1 个答案:

答案 0 :(得分:1)

您的sleep功能是您遇到问题的原因。

当您在Node中创建忙等待循环时,您实际上会停止Node处理任何I / O的能力,例如接受新连接,读/写文件,查询数据库等。

如果要延迟发回响应,则需要异步解决方案。幸运的是,有setTimeout

.success(function(rows) {
  setTimeout(function() {
    response.write(msg + JSON.stringify(rows));
    console.log(msg + (new Date()));
    response.end();
  }, sleepz); // milliseconds
})