node.js表示路由中的嵌套回调

时间:2015-07-05 17:47:11

标签: javascript node.js express

收到错误“无法找到绑定文件”

尝试搜索博客帖子,然后根据博客缩写查找横幅,然后写出

没有横幅查找,一切正常

认为我们搞砸了回调但却找不到好的例子

app.get("/posting/:id", function(req,res) {
  var db = app.get('db');
  var id = [req.params.id];
  console.log(id);
  db.run("select * from postings where id=$1",[1], function(err,posting) {
    console.log(posting);
    var choice = posting[0].choice;
    var banner = banner_lookup(choice, function(err, banner) {
      console.log(banner); 
      res.render("posting", {posting:posting[0], banner:banner});       
    });
  }); 
});
function banner_lookup(abbrev) {
  console.log("banner lookup");
  for (i=0;i++;i<banners.length) {
    if (abbrev == banners[i].abbrev) {
      console.log(banners[i]);
      return (banners[i]);
    }
  }
  return {"name":"","color":"#000"};
}
var banners = [{"abbrev":"aaa","name":"Newsletter A", "color":"#888888"}];

2 个答案:

答案 0 :(得分:0)

你的函数banner_lookup在其decleration上只需要一个参数,但是当你调用它时它会传递它2(选择和回调函数)。

答案 1 :(得分:0)

问题在于该计划的这一部分。您基本上将两个参数传递给banner_lookup函数 - 变量choice和回调函数,您希望在查找之后标题可用

var banner = banner_lookup(choice, function(err, banner) {
  console.log(banner); 
  res.render("posting", {posting:posting[0], banner:banner});       
});

然而,banner_lookup的实际函数定义只接受一个命名参数 - choicebanner_lookup函数计算并返回标题值,但它没有像您期望的那样传递给回调函数。您必须明确编写功能以支持banner_lookup

中的回调功能

您的代码(具有回调功能)将如下所示

function banner_lookup(abbrev, callback) {
   console.log("banner lookup");
   var bannerOutput = {"name":"","color":"#000"};
   for (i=0;i++;i<banners.length) {
      if (abbrev == banners[i].abbrev) {
          console.log(banners[i]);
          bannerOutput = banners[i];
      }
   }
   if(typeof callback == "function") {
       callback(null, bannerOutput);
   } else {
       return bannerOutput;
   }
 }

上面的方法现在接受一个callback参数,如果它被定义为一个函数,那么将输出传递给函数,否则就像之前一样返回它。

提示1 :如果banner_lookup函数正在同步执行简单任务,则实际上不需要实现回调功能。你可以简单地写

   var banner = banner_lookup(choice);
   console.log(banner);

此横幅将具有预期结果。

提示2 :正如Amit在评论中指出的,请阅读有关SQL注入攻击的内容。确保清理所有进行数据库查询的变量(您直接接受路由中的id参数并将其传递给数据库查询,这很容易被误用。