javascript - 回调如何在 Node js中真正起作用

标签 javascript node.js meteor callback

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

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 ,因为没有路由并且由于回调我会得到 404 错误.

但如果我转到 localhost:3000/login ,它会显示我的 login.html 页面,但没有回调被调用。即使没有错误,我的意思是至少它应该首先打印回调中的控制台消息。但为什么不调用回调?

我读到的关于回调的内容是,如果你没有指定任何路径,它会为所有路由调用。但为什么不在这里?如果我错了,有人可以花时间阅读这篇文章并澄清我。

最佳答案

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

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

var middlewares = [];

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

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

因此我们现在可以通过遍历数组来处理对服务器的每个请求:

// 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() 被调用,循环停止。

关于javascript - 回调如何在 Node js中真正起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43087854/

相关文章:

node.js - Meteor 最后在 mongodb 中执行的查询?

javascript - Google Analytics 事件未触发包含命中类型

node.js - 导入不起作用 NodeJs 应用程序 React SSR

meteor - {{#each}} 内的 {{#if}} 带有来自每个项目的参数

javascript - 无法查看 JSON 数据

node.js - 如何使用脚本导航 <a> 标记中的链接?

javascript - Meteor SimpleSchema 重复嵌套对象

javascript - 单击时禁用 <li> 元素

javascript - 如何知道某个 JS 插件是否已加载?

javascript - TypeScript:模块和具有静态成员的类有什么区别?