Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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
Mysql 承诺定制方法_Mysql_Node.js_Promise_Bluebird_Node Mysql - Fatal编程技术网

Mysql 承诺定制方法

Mysql 承诺定制方法,mysql,node.js,promise,bluebird,node-mysql,Mysql,Node.js,Promise,Bluebird,Node Mysql,我对Node和JS世界还很陌生。我希望triyng实现的是“模块化”我的查询,并在各种场景中重用它们。这是我的数据库经理: 'use strict' const mysql = require('mysql') var Promise = require('bluebird') var using = Promise.using Promise.promisifyAll(require('mysql/lib/Connection').prototype) Promise.promisifyAl

我对Node和JS世界还很陌生。我希望triyng实现的是“模块化”我的查询,并在各种场景中重用它们。这是我的数据库经理:

'use strict'

const mysql = require('mysql')
var Promise = require('bluebird')
var using = Promise.using
Promise.promisifyAll(require('mysql/lib/Connection').prototype)
Promise.promisifyAll(require('mysql/lib/Pool').prototype)
const config = require('./config')

var pool = mysql.createPool({
    connectionLimit: 100,
    host: config.dbHost,
    user: config.dbUser,
    password: config.dbPassword,
    database: config.db,
    debug: config.dbDebug
})

var getConnection = function () {
    return pool.getConnectionAsync()
        .disposer(function (connection) {
            return connection.release()
        })
}

var query = function (command) {
    return using(getConnection(), function (connection) {
        return connection.queryAsync(command)
    })
}

module.exports = {
    query: query
}
在一个单独的文件中,我想调用一个查询,然后根据查询结果调用另一个查询(第二个查询使用第一个查询的结果值):

我如何“承诺”我的方法?更重要的是:这是分离mySQL查询的正确方法吗?你能推荐一些最佳实践吗

为完整起见,以下是我执行查询的方法1:

module.exports = {
    method1: function () {
        // ...sql
        db.query(mysql.format(sql, params))
            .then(function (results) {
                return results[0].id // clearly this is not a promise
            })
            .catch(function (error) {
                console.error('Error while retrieving...: ' + error)
                res.status(500).send('Internal server error')
            })
    }
}

你实际上离承诺很近:)

当然,
结果[0]。id
不是承诺,但它是承诺的最终值

您应该做的是返回查询的承诺链:

return db.query(mysql.format(sql, params))
    .then(function (results) {
        return results[0].id // clearly this is not a promise
    })
    .catch(function (error) {
        console.error('Error while retrieving...: ' + error)
        res.status(500).send('Internal server error')
    })
这样做,您将返回一个承诺,该承诺要么用您链的最后一个值解决,要么失败。您可以按照您要求的方式使用它:

method1.then(function(value){
    // Here, value is results[0].id
})
.catch(function(err){
    // Manage a failed query
});

有一篇很棒的帖子,你可能想读一下承诺是如何起作用的:

只需返回即可。=)非常感谢。你怎么看待这种代码骨架?我不知道如何理解你的问题。如果你在谈论代码架构,我会说保持简单。看起来您没有使用类似ORM的Sequelize(您可能想看看!)。尝试将所有SQL操作作为简单的数据访问层进行管理。零业务逻辑。只需关注基本的CRUD操作,并将实体拆分为节点模块。此外,要注意一致性,不断兑现承诺。如果这不是重点,那么,对不起!
method1.then(function(value){
    // Here, value is results[0].id
})
.catch(function(err){
    // Manage a failed query
});