【问题标题】:Node js: Assign mysql result to requests节点js:将mysql结果分配给请求
【发布时间】:2012-02-22 09:19:49
【问题描述】:

以前我是 PHP 开发人员,所以这个问题对你们中的一些人来说可能是愚蠢的。

我正在使用带有节点 js 的 mysql。

client.query('SELECT * FROM users where id="1"', function selectCb(err, results, fields) {
    req.body.currentuser = results;
  }
);
console.log(req.body.currentuser);

我尝试将结果集 (results) 分配给变量 (req.body.currentuser) 以在函数外部使用它,但它不起作用。

请告诉我一个解决方法。

【问题讨论】:

    标签: mysql node.js


    【解决方案1】:

    查询调用是异步的。因此,selectCb 在您的 console.log 调用之后执行。如果您将console.log 调用放入selectCb,它将起作用。

    一般来说,您希望调用依赖于来自selectCb 回调的查询结果的所有内容。这是 Node.JS 中的基本架构原则之一。

    【讨论】:

    • 不,但我需要它在函数之外。我刚刚添加了console.log 供大家理解。但实际上 client.query 是写在一个函数中的,我需要返回值。
    • @Vasanth 如前所述,您想更改您的架构,以便在功能之外不需要它。这就是 node.JS 的工作方式。
    【解决方案2】:

    client.query 调用与 node.js 中的几乎所有内容一样,是异步的。这意味着该方法只是发起一个请求,但继续执行。因此,当它到达 console.log 时,req.body.currentuser 中还没有定义任何内容。

    你可以看到如果你把控制台日志移动到里面回调,它会起作用:

    client.query('SELECT * FROM users where id="1"', function selectCb(err, results, fields) {
        req.body.currentuser = results;
        console.log(req.body.currentuser);
    });
    

    因此,您需要围绕此要求构建代码。事件驱动的函数式编程(就是这样)一开始可能难以理解。但是一旦你得到它,它就会很有意义。

    【讨论】:

    • 不,但我需要它在函数之外。我刚刚添加了console.log 供大家理解。但实际上 client.query 是写在一个函数中的,我需要返回值。
    • @VasanthV,不幸的是,没有办法在回调之外访问它。它是 node.js 的基本设计原则。你必须围绕这个重构你的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2017-08-19
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多