如何使用Sequelize和Javascript返回查询结果?

时间:2013-05-05 22:48:22

标签: javascript database sequelize.js

我是javascript的新手,我在这里遇到了困难。我甚至不认为这是一个Sequelize问题,可能更多关于javascript行为。

我有这段代码:

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

var行返回我想要的值,但除了打印到控制台之外我不知道如何访问它们。我已经尝试返回该值,但它没有返回到我期望的位置,我不知道它在哪里。我想要我的排,但我不知道如何获得它:(

2 个答案:

答案 0 :(得分:6)

在服务器端使用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});
          }
      });
});

忽略注入和纯文本密码示例 - 为简洁起见。

函数通过存储对定义函数的作用域中的任何变量的引用来充当“闭包”。在上面的示例中,我提供的回调每个请求都存储了正确的res值以供参考。续集。这样做的直接好处是,在查询运行时可以处理更多请求,一旦完成,将执行更多代码。如果不是这种情况,那么您的进程(假设Node.js)将等待该一个查询完成阻止所有其他请求。这是不希望的。回调样式使得您的代码可以执行所需的操作并继续前进,等待重要的或重要的处理程序完成并在完成后调用函数。

修改

自回答此问题以来,处理回调的API已发生变化。 Sequelize现在从Promise返回.query,因此您需要更改.success.then

答案 1 :(得分:3)

根据changelog

  

向后兼容性更改

     

已删除事件支持,因此使用.on('success')或.success()   不再受支持。请尝试使用.then()。

根据此Raw queries documentation,您现在将使用类似的内容:

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