关于node学习中调用方法传入参数的问题
发布于 10 年前 作者 tylrwu 5822 次浏览 最后一次编辑是 8 年前 来自 问答

今天开始在跟着alsotang大神的node lessons学习node,之前有些Rails的经验,除了node也在从头学习JS,学习过程中遇到一个问题:

发现调用方法的时候自己完全不知道该传入什么参数,拿下面这个例子说吧,

app.get('/', function (req, res, next) {
  // 用 superagent 去抓取 https://cnodejs.org/ 的内容
  superagent.get('https://cnodejs.org/')
    .end(function (err, sres) {
      // 常规的错误处理
      if (err) {
        return next(err);
      }
      // sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后
      // 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`
      // 剩下就都是 jquery 的内容了
      var $ = cheerio.load(sres.text);
      var items = [];
      $('#topic_list .topic_title').each(function (idx, element) {
        var $element = $(element);
        items.push({
          title: $element.attr('title'),
          href: $element.attr('href')
        });
      });

      res.send(items);
    });
});

这段代码配上注解清楚得一塌糊涂 :) 但,这些传入的回掉函数的参数我怎么知道该传哪些进去呢?譬如function(req, res, next) 里面的next是哪里来的?又譬如function (err, sres)中的sres,不光是node,我发现之前看到很多js框架都有同样一个问题,我跑去看了下文档,也都没有具体说明,对js整个生态不熟悉,很是苦恼啊,还望高人指点

4 回复

Node.js中的很多都是异步回调来获取执行结果。因此存在很多回调函数,回调函数也是函数,既然是函数就存在函参,因此你所说的那些都是异步函数的执行结果,为了能够将获取这些执行结果,其将执行结果作为参数传递到回调函数中。 那这些参数就是异步函数的执行结果,返回的信息。 例如:app.get(’/’, function (req, res, next) {}),其中res和req,next就是所谓app.get函数执行后返回结果,由于是异步的因此你无法通过 var result = app.get(’/’, function (req, res, next) {}); 上面的方式获得执行结果,因此其通过匿名回调函数function的函数参数中,获取执行结果。

//some code which is like in express
var app = {};

app.get = function(str, callback) {

	var req = app.req;
	var res = app.res;
	//somecode do with str

	//...

	//at last
	callback(req, res);
};



//import code
app.get('/', function(req, res) { // this function is param which you pass to app.get()
	//do with req res
});

//and you can write like this 

function hanlder(req, res) {
	//do with req res 
};

app.get('/app', handler);
写了一点示例代码,当你调用app.get的时候需要给他传递一个函数参数,这里面你用的是匿名函数function(req,res){};
多了解一下回调函数就明白了。可以百度一下js回调函数

@dayuoba @huangdh3

谢谢两位!跟进一个较低级的问题,那我怎么知道会返回回来什么呢?只有知道方法会返回回来什么,我才好写回掉函数,配上合适的参数去’接‘住返回回来的东西吧?

嗯,对的,一般的模块在api文档中会给出的,查询api文档即可

回到顶部