Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node.js实现多个MySQL查询的方法_Javascript_Mysql_Node.js - Fatal编程技术网

Javascript 使用Node.js实现多个MySQL查询的方法

Javascript 使用Node.js实现多个MySQL查询的方法,javascript,mysql,node.js,Javascript,Mysql,Node.js,我是事件/回调风格编程和NodeJS的新手。我正在尝试实现一个小型http服务器,它使用节点mysql模块提供ddbb数据 我的问题来自结构化。由于经常存在需要运行以前查询的结果的查询,因此我无法同时(异步)运行所有查询,并且我被迫等待一些结果 我的第一种方法是同时运行所有非依赖查询,然后循环,直到所有查询都设置了一个标志,表明我完成了,这样我就可以继续使用依赖(同步)查询,但我不知道这是否是正确的方法 大概是这样的: function x(){ var result_for_async

我是事件/回调风格编程和NodeJS的新手。我正在尝试实现一个小型http服务器,它使用节点mysql模块提供ddbb数据

我的问题来自结构化。由于经常存在需要运行以前查询的结果的查询,因此我无法同时(异步)运行所有查询,并且我被迫等待一些结果

我的第一种方法是同时运行所有非依赖查询,然后循环,直到所有查询都设置了一个标志,表明我完成了,这样我就可以继续使用依赖(同步)查询,但我不知道这是否是正确的方法

大概是这样的:

function x(){
    var result_for_asynch_query_1 = null
    var result_for_asynch_query_2 = null

    mainLoop(){
        // call non-dependant query 1
        // call non-dependant query 2

        // loop until vars are != null

        // continue with queries that require data from the first ones
    }
}

//for each browser request
httpServer{
     call_to_x();
}.listen();
通过这种方式,我可以在最终结果中节省一些时间,因为我不会以串行方式等待所有响应,而是等待最长的响应

有没有一个共同的方法来做到这一点?有什么我不遵循的设计模式吗?

试着换一种方式思考(关于异步流有很好的介绍)


人们应该避免厄运金字塔:

var express=require('express');
var Q=要求('Q');
var-app=express();
app.get('/',函数(req,res){
var mysql=require('mysql');
var connection=mysql.createConnection({
主机:“localhost”,
用户:'根',
密码:“”
});
connection.connect();
函数doQuery1(){
var defered=Q.defer();
connection.query('选择1作为解决方案',defered.makeNodeResolver());
延期归还。承诺;
}
函数doQuery2(){
var defered=Q.defer();
connection.query('SELECT 2 AS solution',defered.makeNodeResolver());
延期归还。承诺;
}
Q.all([doQuery1(),doQuery2()])。然后(函数(结果){
res.send(JSON.stringify(结果[0][0][0]。解决方案+结果[1][0][0]。解决方案));
//提示:您的第三个查询将转到此处
});
连接。结束();
});
app.listen(80);
log(“在端口80上侦听”);
此示例显示的结果取决于两个独立的计算值。 这些值中的每一个都在doQuery1和doQuery2中查询。它们按顺序执行,但异步执行

接下来您可以看到
Q.all(…
,它基本上在成功时调用“then”回调。在该回调中,计算完成

使用承诺(细节:和)可以使您的代码更干净,将计算和结果处理分开,并将内容四处移动

看看添加“doQuery3”作为计算的先决条件是多么容易

并在“package.json”下面显示示例代码:

{
“姓名”:“你好,世界”,
“说明”:“你好,世界测试应用程序”,
“版本”:“0.0.1”,
“私人”:没错,
“依赖项”:{
“快车”:“3.2.0”,
“q”:“0.9.3”,
“mysql”:“2.0.0-alpha7”
}
}

我发现以下内容对解决此问题非常有帮助:

摘自-这里有很多其他的好例子

function async(arg, callback) {
  console.log('do something with \''+arg+'\', return 1 sec later');
  //replace setTimeout with database query  
  setTimeout(function() { callback(arg * 2); }, 1000);
}
// Final task (return data / perform further operations)
function final() { console.log('Done', results); }

// A simple async series:
var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
function series(item) {
  if(item) {
    async( item, function(result) {
      results.push(result);
      return series(items.shift());
    });
  } else {
    return final();
  }
}
series(items.shift());

“获取一组项并使用第一项调用series control flow函数。series启动一个async()操作,并向其传递回调。回调将结果推送到结果数组中,然后使用项数组中的下一项调用series。当项数组为空时,我们调用final()函数。”(来自)

另一种解决方案是连接所有语句,每个语句以分号结尾。例如,要从多个表中进行选择,可以使用此查询:

var sql='select*from user;select*from admin;'

然后,您只能使用一个连接来执行多个语句:

var connection=mysql.createConnection({multipleStatements:true})
连接查询(sql)


注意:默认情况下禁用多个语句以防止SQL注入。请确保正确地转义所有值。

如果您有100个db查询,我想您会嵌套100个func?非常讨厌和难看。如果没有更好的答案,那么答案是,您不应该(而不是不能)。如果您有100个查询,则db设计中有问题。No,不幸的是,要实际并行运行查询,您需要在各自的连接中运行每个查询。mysql协议的设计方式是,您需要等待上一个命令的结果,然后才允许发送下一个查询。执行此操作时,
db.query(sql1);db.query(sql2);
sql2在sql1之前一直在命令队列中complete@AndreySidorov,如果您有100个查询,那么您的数据库设计就有问题。显然,您从未参与过大型项目。@Green我不是说“一个项目中有100个不同的查询”,我是说“100个查询,其中每个查询都取决于前一个查询的结果”谢谢,我一辈子都搞不懂处理多个mysql nodejs调用的控制流的语法!我不相信这些查询会并行执行。事实上,文档清楚地表明它们不是:您在连接上调用的每个方法都是按顺序排队和执行的。”事实上,此解决方案显然适用于更一般的情况。事实上,它避免了末日金字塔或通过englobing作用域进行数据共享。ES6现在内置了
promise
s
function async(arg, callback) {
  console.log('do something with \''+arg+'\', return 1 sec later');
  //replace setTimeout with database query  
  setTimeout(function() { callback(arg * 2); }, 1000);
}
// Final task (return data / perform further operations)
function final() { console.log('Done', results); }

// A simple async series:
var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
function series(item) {
  if(item) {
    async( item, function(result) {
      results.push(result);
      return series(items.shift());
    });
  } else {
    return final();
  }
}
series(items.shift());