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

发布于 2022-09-05 21:40:23 字数 1455 浏览 12 评论 0

先上代码:

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. 请针对以上描述的问题场景回答,因为换一种方式(比如连接数据查询就不要回调)我也知道怎么处理,我只想请教只针对于这种情况的解决方法,谢谢各位大神!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

初心未许 2022-09-12 21:40:23

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) {}
});
夜唯美灬不弃 2022-09-12 21:40:23

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

北座城市 2022-09-12 21:40:23

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文