node js 回调方法怎么获取返回值?

先上代码:

db_mysql.js

/** Import mysql module */
var mysql = require('mysql');
var DBConfig = require('./db_config');

/** create mysql connection pool */
var pool = mysql.createPool( DBConfig.mysql );

exports.do = function ( sql, callback) {
    pool.getConnection(function (err, connection) {

        connection.query(sql, function () {

            callback.apply(connection, arguments);

            connection.release();
        });
    });
}

article.js

var express = require('express');
var router = express.Router();
var mysql = require('mysql');
var db = require('../db/db_mysql');

/** 查询结果的回调函数 */
var callFunc = function (err, result, fields) {
    console.log(err);
    console.log(result);
    console.log(fields);
}

router.get('/test', function (req, res, next) {
    var querySql = 'SELECT * FROM cp_tag WHERE tid=1';

    db.do(querySql, callFunc);
    
    // 这里怎么拿到callFunc 的err, result??? 因为下面res 要返回数据
    
    console.log('------------response');

});

module.exports = router;

问题:

  1. article.js中,执行完 db.do(querySql, callFunc)之后应该是处理查询结果准备返回请求结果数据了,但这里callFunc是回调, 又是异步执行,请问该怎么拿到callFunc的数据库查询结果呢?
  2. 请针对以上描述的问题场景回答,因为换一种方式(比如连接数据查询就不要回调)我也知道怎么处理,我只想请教只针对于这种情况的解决方法,谢谢各位大神!
阅读 9.7k
3 个回答

1 把callFunc挪下来

router.get('/test', function (req, res, next) {
    var querySql = 'SELECT * FROM cp_tag WHERE tid=1';
    
    /** 查询结果的回调函数 */
    var callFunc = function (err, result, fields) {
        console.log(err);
        console.log(result);
        console.log(fields);
        
        // // 这里怎么拿到callFunc 的err, result??? 因为下面res 要返回数据
        // 把query完的逻辑放到这里,res、next在这里都可以拿到
    
        console.log('------------response');
    }
        
    
    db.do(querySql, callFunc);
});

2 async/await/Promise

// api
exports.do = function ( sql) {
    return new Promise(function(resolve, reject) {
        pool.getConnection(function (err, connection) {
            if(err) reject(err);
            else {
                connection.query(sql, function (err, ...arg) {
                    if(err) reject(err);
                    else resolve(arg);
                    connection.release();
                });
            }
        });
    });
}

router.get('/test', async function (req, res, next) {
    var querySql = 'SELECT * FROM cp_tag WHERE tid=1';
    
    try {
        var [result, fields] = await db.do(querySql);
        
        // 顺序写就是了,下面的逻辑是啥?
        
        console.log('------------response');
    } catch(e) {}
});

一定要异步回调解决的话,可能就只能把res也放进回调了吧。【于是乎陷入了回调地狱?】

为什么不考率用一些 orm 库 比如 knex sequelize

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题