Nodejs setget方法中回调函数 返回值问题

Nodejs setget方法中回调函数 返回值问题

//dbCon.js

  • var setUser = function (callback) {
  • sql.open(conn_str, function (err, conn) {
    
  •     if (err) {
    
  •         console.log("Error opening the connection!");
    
  •         return callback(err);
    
  •     }
    
  •     conn.queryRaw
    
  •     (
    
  •     "SELECT Username,Password FROM Users", function (err, results) {
    
  •         if (err) {
    
  •             console.log("Error running query!");
    
  •             return callback(err);
    
  •         }
    
  •         for (var i = 0; i < results.rows.length; i++) {
    
  •             users += results.rows[i][0].toString() + ",";
    
  •             console.log(users);
    
  •         }
    
  •         callback(err, users.substring(0, users.lastIndexOf(",")));
    
  •     }
    
  •     );
    
  • });
    
  • };
  • exports.setUser = setUser;

//im.js

  • var user = require(’./dbCon.js’);
  • var uids = “”;
  • function uid(callback) {
  • user.setUserId(function (err, data) {
    
  •     uids = data;
    
  •     callback(err, uids);
    
  • });
    
  • }
  • exports.uid = uid;

//cookies.js

  • var cookies = {
  • (…set…省略了)
  • get: function (name) {
  • if (name == “uid”) {
  •        var u = require('./im.js');//主要是这部分主要是这部分主要是这部分主要是这部分主要是这部分
    
  •         u.uid(function (err, data) {
    
  •           return data;//没有值。如果把这部分全部去掉。进来if直接  return "123“  就没问题。怎么弄?怎么弄????
    
  •       });
    
  •     }
    
  •     else return null;
    
  • }
    
  • }

//前台 <script> cookies.get(‘uid’); </script>

当参数是uid的时候,就通过im.js中的函数返回一个值,这部分代码放到单独的js中没有问题的。


3 回复

怎么破、、、怎么破啊


Node.js SetGet 方法中回调函数返回值问题

背景

在Node.js中使用异步编程时,经常会遇到回调函数的返回值问题。本文将探讨如何在回调函数中正确处理返回值,并提供一个示例来说明。

示例代码

dbCon.js

首先,我们定义一个用于获取用户信息的模块dbCon.js

var setUser = function (callback) {
    sql.open(conn_str, function (err, conn) {
        if (err) {
            console.log("Error opening the connection!");
            return callback(err);
        }

        conn.queryRaw(
            "SELECT Username, Password FROM Users",
            function (err, results) {
                if (err) {
                    console.log("Error running query!");
                    return callback(err);
                }

                var users = '';
                for (var i = 0; i < results.rows.length; i++) {
                    users += results.rows[i][0].toString() + ",";
                }

                callback(null, users.substring(0, users.lastIndexOf(",")));
            }
        );
    });
};

exports.setUser = setUser;
im.js

接下来,我们定义一个模块im.js,它依赖于dbCon.js并调用其中的setUser函数:

var user = require('./dbCon.js');
var uids = "";

function uid(callback) {
    user.setUser(function (err, data) {
        uids = data;
        callback(err, uids);
    });
}

exports.uid = uid;
cookies.js

最后,我们定义一个处理cookie的模块cookies.js

var cookies = {
    get: function (name) {
        if (name === "uid") {
            var u = require('./im.js');

            u.uid(function (err, data) {
                if (err) {
                    console.error(err);
                    return;
                }
                return data;
            });
        } else {
            return null;
        }
    }
};

module.exports = cookies;

解释

  1. dbCon.js: 这个文件包含一个异步函数setUser,它从数据库查询用户信息并调用回调函数返回结果。
  2. im.js: 这个文件导入dbCon.js并调用其setUser函数,将结果存储在uids变量中,然后通过回调函数返回结果。
  3. cookies.js: 这个文件处理cookie逻辑。当请求获取uid时,它会调用im.js中的uid函数,并通过回调函数返回结果。

问题分析

cookies.js中,当你尝试直接返回data时,由于回调函数是异步执行的,因此无法直接返回结果。你需要通过回调函数的方式处理异步返回值。

解决方案

你可以修改cookies.js中的get方法,使其支持回调函数,从而正确处理异步返回值:

var cookies = {
    get: function (name, callback) {
        if (name === "uid") {
            var u = require('./im.js');

            u.uid(function (err, data) {
                if (err) {
                    console.error(err);
                    return callback(null, null);
                }
                callback(null, data);
            });
        } else {
            callback(null, null);
        }
    }
};

module.exports = cookies;

前端代码

在前端代码中,你可以这样使用:

<script>
    cookies.get('uid', function(err, data) {
        if (err) {
            console.error(err);
            return;
        }
        console.log(data); // 输出获取到的uid
    });
</script>

通过这种方式,你可以在异步操作完成后正确地处理返回值。

在Node.js中,由于其非阻塞I/O特性,异步函数的回调机制会导致一些常见的问题,特别是在处理返回值时。在你的cookies.js文件中,试图直接从回调函数中返回值是不可能的,因为回调函数是在异步操作完成后被调用的。

示例代码

dbCon.js

var sql = require('some-sql-library');
var conn_str = 'your-connection-string';

var setUser = function (callback) {
    sql.open(conn_str, function (err, conn) {
        if (err) {
            console.log("Error opening the connection!");
            return callback(err);
        }

        conn.queryRaw(
            "SELECT Username, Password FROM Users",
            function (err, results) {
                if (err) {
                    console.log("Error running query!");
                    return callback(err);
                }

                let users = '';
                for (let i = 0; i < results.rows.length; i++) {
                    users += results.rows[i][0].toString() + ",";
                }
                callback(null, users.substring(0, users.lastIndexOf(",")));
            }
        );
    });
};

module.exports = { setUser };

im.js

var dbCon = require('./dbCon');

var uids = "";

function getUids(callback) {
    dbCon.setUser(function (err, data) {
        if (err) {
            console.error(err);
            return callback(err);
        }
        uids = data;
        callback(null, uids);
    });
}

module.exports = { getUids };

cookies.js

var im = require('./im');

var cookies = {
    get: function (name) {
        if (name === "uid") {
            im.getUids(function (err, data) {
                if (err) {
                    console.error(err);
                    return;
                }
                console.log(data); // 这里可以处理数据
            });
        } else {
            return null;
        }
    }
};

module.exports = cookies;

解释

  1. dbCon.js: 提供了一个setUser函数,该函数执行数据库查询并返回用户名列表。
  2. im.js: 提供了一个getUids函数,该函数调用setUser并处理结果。
  3. cookies.js: 提供了一个get函数,该函数根据name参数调用getUids函数。注意,这里不能直接返回异步操作的结果,因为它是异步的。你需要在回调函数内部处理结果。

如果你需要在其他地方使用这些数据,建议将数据传递给需要的地方或使用事件驱动的方式来处理这些异步结果。

回到顶部