像这样在服务器端使用 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 现在返回一个Promise
from.query
因此更改.success
为.then
应该是您需要做的所有事情。