【发布时间】:2014-08-16 09:27:14
【问题描述】:
我有一个异步的数据库查询(函数),因此我需要使用回调函数(没问题)。但是,在 Node.js 中,我需要在同一个 POST 函数中进行两个单独的查询。两者都是异步的,所以我在如何继续执行 POST 时遇到了麻烦。
目标:
- 验证表单条目是否存在畸形等
- 保存前检查数据库中是否存在用户名(必须唯一)
- 保存前检查数据库中是否存在电子邮件(必须是唯一的)
- 如果一切都检查成功,则保存用户,否则会引发一些错误
通常,我会有这样的东西(过于简单):
postSearch = function(req, res, next) {
var searchCallback = function(err, results) {
// Do stuff with the results (render page, console log, whatever)
}
// This is the db query - async. Passes search results to callback
defaultSearch(input, searchCallback);
}
只有一个异步查询,所以只有一个回调。通常我只会得到数据库结果并呈现一个页面。现在我必须验证一些表单数据,所以我的 POST 函数看起来像这样:
postUser = function(req, res, next) {
// Some static form validation (works, no issues)
var usernameExistsCallback = function(err, exists) {
// Does the username exist? True/false
}
// DB query - passes true or false to the callback
usernameExists(username, usernameExistsCallback);
var emailExistsCallback = function(err, exists) {
// Does the email exist? True/false
}
// DB query - passes true or false to the callback
emailExists(email, emailExistsCallback);
// Check if ALL validation constraints check out, implement error logic
}
node-postgres 模块是异步的,因此查询需要回调(如果我想返回任何值,否则我可以运行查询并断开连接)。我执行这两个查询都没有问题。我可以在回调中console.log() 正确的结果。但现在我不知道以后如何在 postUser 函数中访问这些结果。
我已经阅读了所有关于异步 JavaScript 函数的内容,但是我已经在这方面摸索了三个小时,现在正在尝试一些荒谬的事情(比如设置 全局变量 [oh my!])没用。
我需要的这两个查询的结果只是true 或false。如何组织此代码以便能够在 postUser 函数中使用这些结果?在我看来,我需要类似 third 回调的东西,但我不知道如何实现类似的东西。我有必要开始使用async吗?这会是个好主意吗?到目前为止,这个应用程序中没有什么是超级复杂的,我想保持低依赖这是有道理的。
【问题讨论】:
标签: javascript node.js postgresql asynchronous