多个根处理程序的目的是什么?

时间:2017-09-23 19:56:41

标签: javascript express routing

如上所述,可以提供多个回调函数,其行为类似于中间件来处理请求。它们可以是函数,函数数组或两者的组合形式,如以下示例所示。

例如:

app.get('/example/b', function (req, res, next) {
  console.log('the response will be sent by the next function ...')
  next()
}, function (req, res) {
  res.send('Hello from B!')
})

这是什么目的?我们不能简单地使用:

app.get('/example/b', function (req, res) {
  console.log('the response will be sent by the next function ...')
  res.send('Hello from B!')
})

2 个答案:

答案 0 :(得分:1)

当您已经拥有可能打算在多个位置使用的先前定义的函数时,更有可能使用多个函数。例如:

app.get("/somePath", checkAuth, function(req, res) {
    // you know it's already authenticated here
});

app.get("/someOtherPath", checkAuth, function(req, res) {
    // you know it's already authenticated here
});

function checkAuth(req, res, next) {
    if (some logic here) {
        // allow handler chain to continue
        next();
    } else {
        // auth error
        res.status(401).end();
    }
}

当然,您也可以使用中间件来检查身份验证,但上面的示例允许您使用一些可以在多个位置使用的中间件来定位几个特定路由。

正如您已经观察到的那样,如果您不打算在其他任何地方使用该函数,那么您也可以将逻辑放入您的一个处理程序中。

答案 1 :(得分:1)

是的,你可以,例如,目的是处理错误,快递中的中间件序列允许你使用这种方式。例如,看到这种方式来设置快速配置:

 app.use(logger.connectLogger());
 app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({
     extended: false 
 }));
 app.use(routes);
 app.use(errorConnect);

 http.createServer(app).listen(config.port, function () {
     logger.getLogger().info('My backend listening on port: ' + config.port);
 });

我的路线模块具有所有匹配路线 - >回调:

// Methods exposed for backend API.
router.get('/status', ips.getStatus);
router.route('/ip')
    .post(ips.keepIps)
    .get(ips.getIps)
    // NOT ALLOWED
    .put(returnNotAllowed)
    .delete(returnNotAllowed);

// Methods exposed and used by IP's frontend.
router.route('/front/ip')
  .get(front.getIpsByFront)
  .post(front.keepIpsByFront);
router.post('/login', login.login);
....

例如,在其中一个回调中,我有下一个管理传入请求的方法:

/**
 * Login user from frontend.
 */
exports.login = function(req, res, next) {
    var username = req.body.username + '@System',
        password = req.body.password,
        server = req.body.server,
        auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');

    loginApi.login(auth, server)
        .then(function(result) {
            res.statusCode = 200;
            res.send(result);
        })
        .catch(function(error) {
            next({
                statusCode: 403,
                message: 'Error in login'
            });
        });
};

当我发现错误时,我使用自定义错误对象调用next,然后,如果您回来查看配置(第一段),您可以看到我在快速中间件中添加了错误管理使用errorConnect。在我看来,这是了解你所问的内容的一种有用的方法,因为如果我理解得很好,你会怀疑next()