4

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

我有这个代码:

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

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

4

2 回答 2

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存储正确的值以供我提供给 sequelize 的回调根据请求进行引用。这样做的直接好处是可以在查询运行时处理更多请求,并且一旦完成,将执行更多代码。如果不是这种情况,那么您的进程(假设 Node.js)将等待该一个查询完成阻止所有其他请求。这是不希望的。回调风格是这样的,你的代码可以做它需要做的事情并继续前进,等待重要的或处理器繁重的部分完成并在完成后调用一个函数。

编辑

自从回答这个问题以来,处理回调的 API 已经发生了变化。Sequelize 现在返回一个Promisefrom.query因此更改.success.then应该是您需要做的所有事情。

于 2013-05-05T22:58:09.027 回答
3

根据变更日志

向后兼容性更改

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

根据这个原始查询文档,您现在将使用这样的东西:

sequelize.query("SELECT * FROM `users`", { type: sequelize.QueryTypes.SELECT})
    .then(function(users) {
        console.log(users);
    });
于 2016-07-15T15:26:00.077 回答