mysql
  • node.js
  • 2016-03-14 61 views 0 likes 
    0

    我对nodejs非常陌生,并且在理解如何使用mysql连接对象时遇到了一些困难。nodejs中的同步mysql查询

    我的问题不在代码中,而是在设计模式中。

    可以说我有用户模块

    module.exports = function(){ 
        return{ 
         id: "", 
         load: function(id){ 
          var sql = 'SELECT * from users where id = '+ DB.escape(id); 
          console.log(1); 
          DB.query(sql, function (err, rows) { 
           this.id = rows[0].id; // not working 
           console.log(rows[0].id); // prints the id 4 
           console.log(2); 
          }); 
          console.log(3); 
         } 
        } 
    } 
    

    从模块外部我运行下一个代码

    var user = require('../modules/user'); 
    var selected_user = user(); 
    console.log("entering users me route"); 
    selected_user.load(4); 
    console.log("user id is " + selected_user.id); //This does not print the id 4 
    

    当我运行该代码,控制台日志1,则3,然后2. 这是由于节点js的异步流。

    但是,如果我建立一个网站,我需要查询结束为了填充我的用户对象,然后再将HTML发送到浏览器?

    什么是正确的做法?

    另外,当我尝试填充用户的id属性,我从数据库中收到的ID它不起作用。

    任何想法?

    谢谢

    回答

    2

    有几种方法可以做到这一点。我会去Promises

    假设您有一个异步函数“getUsers”。 它看起来像这样:

    function getUsers() { 
        longQuery(function(err, result){ 
         // What to do with result? 
        }); 
    

    你需要重写它能够使用的结果。 让我们尝试:

    function getUsers() { 
        return new Promise(function(resolve, reject) { 
         longQuery(function(err, result){ 
         if(err) reject(err) 
         else resolve(result) 
         }); 
        }); 
    

    现在这个函数返回一个承诺。我们对这个承诺做了什么?

    function handleRequest(req, res) { 
        getUsers().then(function(result) { 
         // Do stuff with result 
         res.send(myProcessedData); 
        }).catch(function(err) {console.log(err)}; 
    } 
    

    这也可能已经完成与回调,传递响应对象作为参数传递给查询功能,以及许多其他的方式,但我认为承诺是为处理这是一个非常优雅的方式。

    +0

    但是,如果我有一个网页,需要从数据库中查询很多,我希望它能像php说的那样工作。运行查询,获取结果,做点什么,继续前进 –

    +0

    由于node.js非阻塞性质,这目前是不可能的。但是,链接承诺会产生非常类似的流程。 – matanso

    +0

    这正是我所做的,但它似乎很奇怪,因为如果我有20个电话的数据库,我需要改变20个“承诺”一个在另一个里面,这似乎是一个非常糟糕的方式来建立一个网站 –

    0
    this.id = rows[0].id; // not working 
    

    上述行不起作用,因为您在回调函数中将其设置为this.id。当您处于回调函数this中时,并不意味着主对象中的this

    有关此更多的讨论:见How to access the correct `this` context inside a callback?

    为了解决异步JavaScript的性质,你可以使用类似的承诺从matanso答案,或者你可以传递一个回调函数,以您的加载方法。因此,您的load: function(id)方法将为load: function(id, callbackFunction),并在获取所需的所有数据时调用回调函数。

    相关问题