使用与节点的异步

时间:2013-05-29 00:29:20

标签: node.js asynchronous express node-async

我正在尝试在Node中编写一个简单的验证脚本,当某些验证检查失败时,会将错误代码添加到error数组中。为了使事情复杂化,我还有一个名为translate的函数,它调用数据库并返回与错误代码相关的全文(翻译成指定的语言)。为了实现这一目标,我正在使用async库。

不幸的是,即使验证失败,以下代码也会导致空数组。我已经独立确认我的translate功能有效。任何想法为什么这不起作用?

app.post("/user", function(req, res) {

  var error = [];

  if (req.body.username == "") {
    error.push("username_required");
  }

  if (req.body.password == "") {
    error.push("password_required");
  }

  for (var i = 0; i < error.length; i++) {
    error[i] = function(callback) {
      translate(error[i], req.language, function(text) {
        callback(null, text);
      });
    };
  }

  async.parallel(error, function(error, results) {
    res.send(results);
  });

});

translate = function(code, language, callback) {
  var code = database.escape(code);
  var language = database.escape(language);
  database.query("SELECT content FROM text WHERE language = 'en' AND code = " + code, function(error, row) {
    callback(row[0].content);
  });
}

1 个答案:

答案 0 :(得分:4)

正如评论中所建议的那样,async.map成功了。这是我的最终解决方案:

app.post("/user", function(req, res) {

  var error = [];

  if (!req.body.username) {
    error.push("username_required");
  }

  if (!req.body.password) {
    error.push("password_required");
  }

  async.map(error, function(error, callback) {
    translate(error, req.language, function(text) {
      callback(null, text);
    });
  }, function(error, results) {
    res.send(results);
  });

});