javascript - JavaScript 中的两个异步函数 (Node.js)

标签 javascript node.js postgresql asynchronous

我有一个异步的数据库查询(函数),因此我需要使用回调函数(没问题)。但是,在 Node.js 中,我需要在同一个 POST 函数中进行两个单独的查询。两者都是异步的,因此我在如何继续执行 POST 方面遇到了麻烦。

目标:

  1. 验证表单条目是否存在错误等。
  2. 保存前检查数据库中是否存在用户名(必须是唯一的)
  3. 保存前检查数据库中是否存在电子邮件(必须是唯一的)
  4. 如果一切正常,则保存用户,否则抛出一些错误

通常情况下,我会有这样的东西(过于简单化):

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 函数的所有内容,但我已经在这个问题上摸不着头脑了三个小时,现在正在尝试一些荒谬的事情(例如设置全局变量 [哦天哪!])没有效果。

我需要的这两个查询的结果只是truefalse。如何组织此代码以便能够在 postUser 函数中使用这些结果?在我看来,我需要类似第三次回调的东西,但我不知道如何实现类似的东西。我有必要开始使用 async ?这是个好主意吗?到目前为止,这个应用程序中没有什么是 super 复杂的,我希望保持较低的依赖性<->这是有道理的。

最佳答案

这个怎么样:

postUser = function(req, res, next) {
    // Some static form validation (works, no issues)

    var emailExistsCallback = function(err, exists) {
        // Does the email exist? True/false
        var usernameExistsCallback = function(err, exists) {
            // Does the username exist? True/false
            // DO STUFF HERE
        }
        // DB query - passes true or false to the callback
        usernameExists(username, usernameExistsCallback);
    }
    // DB query - passes true or false to the callback
    emailExists(email, emailExistsCallback);

    // Check if ALL validation constraints check out, implement error logic
}

关于javascript - JavaScript 中的两个异步函数 (Node.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24415064/

相关文章:

javascript - 如何在 JavaScript 中旋转跟随光标的图像?

javascript - 仅使用 JavaScript 更新现有 Highstock 图表的数据

javascript - 更复杂的延迟/ promise 使用和链只是不点击。希望得到一些澄清

c++ - 创建一个数据库连接数组

postgresql - 2个Docker容器(JBOSS/DATABASE)之间的网络连接

javascript - highcharts如何覆盖重置缩放按钮事件

node.js - Nodejs - 检索远程文件并检测 mime 类型

node.js - 如何使用 MongoDB 删除对象内部的对象(不在数组内部)

postgresql - 使用 Liquibase CLI 在 Git 推送上更新 PostgreSQL 数据库

javascript - 如何在 node.js 中执行同步 SQL 查询