javascript - 使用 Node.js 处理多个 MySQL 查询的方法

标签 javascript mysql node.js

我是事件/回调样式编程和 NodeJS 的新手。我正在尝试实现一个小型 http 服务器,它使用 node-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 = require('Q');
var app = express();

app.get('/',function(req,res){
    var mysql      = require('mysql');

    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : ''
    });

    connection.connect();

    function doQuery1(){
        var defered = Q.defer();
        connection.query('SELECT 1 AS solution',defered.makeNodeResolver());
        return defered.promise;
    }

    function doQuery2(){
        var defered = Q.defer();
        connection.query('SELECT 2 AS solution',defered.makeNodeResolver());
        return defered.promise;
    }

    Q.all([doQuery1(),doQuery2()]).then(function(results){
        res.send(JSON.stringify(results[0][0][0].solution+results[1][0][0].solution));
        // Hint : your third query would go here
    });

    connection.end();

});

app.listen(80);
console.log('Listening on port 80');

此示例显示的结果取决于 2 个独立的计算值。 这些值中的每一个都在 doQuery1 和 doQuery2 中进行了查询。它们按顺序执行,但异步执行。

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

使用 Promise(详细信息:Github Q: promise for Javascriptwikipedia)可以使您的代码更简洁,将结果的计算和处理分开并移动。

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

下面是示例代码的“package.json”:

{
    "name": "hello-world",
    "description": "hello world test app",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
        "express": "3.2.0",
        "q": "0.9.3",
        "mysql":"2.0.0-alpha7"
    }
}

关于javascript - 使用 Node.js 处理多个 MySQL 查询的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6622746/

相关文章:

javascript - 在antd 4中将初始值设置为动态形式

php - 如何合并数组值?

mysql - 在 codeigniter 事件记录方法中使用 MySQL 函数

javascript - 这段 promise 函数的代码有什么问题?

javascript - 如何在 Messenger 上使用 Node.js/Heroku/Wit.ai ChatBot 在 x 小时后发送推送

javascript - 如何在 react native map 中获取边界

javascript - 从配置中获取变量?

javascript - 当 document.getElementById() 没有时?

mysql - 获取前 3 个月记录的总和

javascript - 如何将经度和纬度转换为街道地址