2013-05-05 42 views
3

我在JavaScript的新的,我已经在这里很难碰了壁。我甚至不认为这是一个Sequelize问题,可能更多关于JavaScript行为。如何退还使用Sequelize和JavaScript查询的结果?

我有这样的代码:

sequelize.query(query).success(function(row){ 
      console.log(row); 
    } 
) 

的VAR行,返回我想要的值(一个或多个),但我不知道如何访问它们比打印到控制台等。我试着返回值,但它没有返回到我期望的地方,我不确定它会发生什么。我希望我的行,但我不知道如何获得它:(

回答

7

在服务器端一样,使用JavaScript,您需要使用回调。你不能“回归”他们像你想要的,但是,您可以写入对结果执行的操作的功能

sequelize.query(query).success(function(row) { 
    // Here is where you do your stuff on row 
    // End the process 
    process.exit(); 
} 

一个更实际的例子,在明确路由处理程序:

// Create a session 
app.post("/login", function(req, res) { 
    var username = req.body.username, 
     password = req.body.password; 
    // Obviously, do not inject this directly into the query in the real 
    // world ---- VERY BAD. 
    return sequelize 
     .query("SELECT * FROM users WHERE username = '" + username + "'") 
     .success(function(row) { 
      // Also - never store passwords in plain text 
      if (row.password === password) { 
       req.session.user = row; 
       return res.json({success: true}); 
      } 
      else { 
       return res.json({success: false, incorrect: true}); 
      } 
     }); 
}); 

忽略注射,明文密码示例 - 为了简洁

0。个

功能充当“封闭”通过存储在函数是在限定的范围的任何变量的引用。以我上面的例子中,正确res值被存储用于通过我已经供给到sequelize回调每个请求参考。这样做的直接好处是可以在查询运行时处理更多的请求,并且一旦完成更多的代码将被执行。如果情况并非如此,那么你的进程(假设Node.js)会等待那一个查询完成阻止所有其他请求。这是不希望的。回调的风格是这样的,你的代码可以做什么,它需要继续前进,等待重要或processer重件完成并调用一个函数一次完成。

编辑

处理回调的API自回答这个问题改变。 Sequelize现在返回从.query一个Promise因此更改.success.then应该是所有你需要做的。

+0

的语言过滤感谢@JonathanHobbs。你的编辑被拒绝,因为我增加了更多的身体(我想自动?),所以我转移了必要的部分。 – 2013-05-05 23:09:55

+0

感谢您的回复!我可能仍然是误解。我已经添加req.session.user存储行数据,以便这些信息可以在函数外部访问,但功能外它仍然是不确定的。最终,我想将这些信息存储在多个页面上,但似乎我不知道如何去做。 – user2352919 2013-05-05 23:19:35

+0

你不能在它定义的范围内访问这个函数中的数据。你必须学习使用服务器端JavaScript来做的第一件事是停止同步思考。无论函数之外的任何代码都需要在函数内部与'req.session'赋值一起使用。看看我给你的例子 - 我不在回调之外处理信息,我在里面做。 – 2013-05-05 23:25:59

1

按照changelog

向后兼容性变化

活动支持使用。对( '成功')或.success() 已经被去除,从而不再受支持。尝试使用.then()代替。

根据本Raw queries documentation你会使用的东西现在这个样子:

sequelize.query("SELECT * FROM `users`", { type: sequelize.QueryTypes.SELECT}) 
    .then(function(users) { 
     console.log(users); 
    }); 
+0

我不确定我的答案是没有用的,我的答案解决了问题中发布的与API更改无关的问题,而这个答案更多的是对我的评论,而不是对问题的直接回答。而我的问题不是“被接受”。提问的人从未标记答案被接受。 – 2016-08-07 14:29:27

+0

没错,我没有注意到。 – 2016-08-07 15:07:42

+0

我正在执行下面,但从结果集中的每一行附加“Rowdatapacket”获取数据我的 var query =“CALL getdata(:pagenum)”; (函数(结果){ console.log(results); })。error(function(results) (err){ }); 如何删除“rowdatapacket” – 2016-10-15 08:33:06

相关问题