Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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承诺共享连接和执行查询_Javascript_Node.js_Asynchronous_Promise - Fatal编程技术网

javascript承诺共享连接和执行查询

javascript承诺共享连接和执行查询,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我想知道这种方法是否正确,或者是否需要进一步的改进,也许还可以推荐定制的mySQLgetConnection方法 request: function(queryRequest) { return new Promise(function(resolve, reject){ Database.getConnection(function(error, connection){ if(error) {

我想知道这种方法是否正确,或者是否需要进一步的改进,也许还可以推荐定制的mySQL
getConnection
方法

    request: function(queryRequest) {
        return new Promise(function(resolve, reject){
            Database.getConnection(function(error, connection){
                if(error) {
                    reject({error: error, queryRequest: queryRequest});
                } else {
                    connection.query(queryRequest.sql, queryRequest.values, function(error, rows, fields){
                        if(error) {
                            reject({error: error, queryRequest: queryRequest});
                        } else {
                            resolve({rows: rows, fields: fields, queryRequest: queryRequest});
                        }
                    });
                }
            });
        });
    },
Database
模块中定义的
getConnection
方法

    getConnection: function(callback) {
        this.pool.getConnection(function(error, connection){
            callback(error, connection);
        });
    },
也许还可以推荐自定义mySQL
getConnection
方法

也许吧。虽然可以认为它更干净,使回调金字塔更平坦,但它并没有对代码进行太多改进:

function request(queryRequest) {
    return new Promise(function(resolve, reject) {
        Database.getConnection(function(error, connection) {
            if (error)
                reject(error);
            else
                resolve(connection);
        });
    }).then(function(connection) {
        var res = new Promise(function(resolve, reject) {
            connection.query(queryRequest.sql, queryRequest.values, function(error, rows, fields) {
                if (error)
                    reject(error);
                else
                    resolve({rows: rows, fields: fields, queryRequest: queryRequest});
            });
        });
        return res;
    }).catch(function(error) {
        throw {error: error, queryRequest: queryRequest};
    });
}
我想知道这种方法是否正确

对于数据库连接,您可能需要查看。如果你不需要它,你仍然应该记得总是释放你的连接,使用类似

….then(function (connection) {
    var res = …;
    // better be solved using `finally` where supported
    return res.then(end, end);
    function end() {
        connection.release();
        return res;
    }
})
另外,拒绝带有无
Error
s对象的承诺是一种不好的做法,您最好这样做

….catch(function(error) {
    error.queryRequest = queryRequest;
    throw error;
})

或者在您的原始模式中的等效项。

啊,在我发表评论之前,您已经修复了
拒绝(错误,queryRequest)
。-)我建议使用连接池或promise库的内置功能(
在bluebird中使用
)提供了
节点mysql
的预期版本。也就是说,这是基于意见的,所以我投票决定结束,欢迎您在javascript聊天室或IRC上的#promises上讨论这个问题。您使用的promise库是什么?第二个库中有一些分号重复,请查看。我读到了有关disposer模式的内容,我们可以在第二个解决方案中使用
connection.release()
+1对于
错误。queryRequest
建议“分号重复”是什么意思?没有语法错误。很抱歉,它是正确的。您是否建议使用
connection.release
根据处理器模式在第二次解析下进行释放?是的,您可能应该在此
请求
方法中包括
connection.release
。可能是在一个额外的
then
处理程序中,尤其是当它可以抛出时。如果每次都使用
连接执行不同的操作,那么disposer模式尤其有用。
connection.query
是您唯一使用的方法,还是您还有其他方法可以调用
Database.getConnection