首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >回调在节点js中是如何工作的?

回调在节点js中是如何工作的?
EN

Stack Overflow用户
提问于 2017-03-29 08:08:54
回答 1查看 78关注 0票数 1

下面是我的代码,它有两个回调和一个get路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.get('/login', function(req, res, next) {
     res.sendFile(__dirname + '/public/views/login.html');
});
app.use(function (req, res, next) {
      console.log("first callback 1");
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
      console.log("first callback 2");
});
app.use(function (err, req, res, next) {
   // set locals, only providing error in development
      console.log("second callback");
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
  // render the error page
     res.status(err.status || 500);
     res.render('error');
     console.log("error send");
});

基本上,这里的两个回调是针对错误的,我运行应用程序并转到localhost:3000/home,因为没有路由,并且由于回调,我将得到404Error。

但是如果我转到localhost:3000/login,它会显示我的login.html页面,但没有回调得到called.Even,尽管没有错误,我的意思是至少它应该在callback.But中打印第一个控制台消息,为什么它没有调用回调?

我读到的关于回调的内容是,如果你没有指定任何路径,它会被所有的routes.But调用,为什么不在这里呢?如果我错了,有人能花点时间读一下并清除我的错误吗?

EN

回答 1

Stack Overflow用户

发布于 2017-03-29 09:54:59

这与回调无关。它是关于Express中的中间件(插件/模块)架构是如何工作的(顺便说一句,还有许多其他框架,但请注意:并不是所有的框架都是这样工作的)。

Express实现的真正代码是模块化的,有点复杂,但基本上它的工作原理是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var middlewares = [];

var app = {
    use: function (callback) {
        middlewares.push({path:"", callback: callback});
    },
    get: function (path, callback) {
        middlewares.push({path: path, callback: callback});
    }
}

所以你看,这个想法很简单。真的没什么花哨的。.use()用于添加要在所有路径下执行的代码,.get()用于添加要在路径匹配时执行的代码。

因此,我们现在可以通过循环遍历数组来处理发送到服务器的每个请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WARNING: NOT REAL CODE, this is only meant as an illustration

function processRequest (req, res) {
    for (var i=0; i<middlewares.length; i++) {
        var whatToDo = middlewares[i];

        if (whatToDo.path == "") { // no need to check path
            whatToDo.callback(err, req, res, next);
        }
        else if (whatToDo.path == req.path) { // check if path match
            whatToDo.callback(req, res, next);
        }
    }
}

这就是它的工作原理。当然,中间件是异步的,所以在实际代码中我们不能使用for循环。这就是next()函数的实际用途--像链表一样循环遍历中间件(只有它的链接函数)。如果没有调用next(),则循环停止。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43087854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文