简化此node.js函数的调用方式

时间:2015-12-22 10:12:26

标签: javascript node.js restify

我正在使用node.js restify。

以下代码可以正常使用。

var server = restify.createServer({
    name: 'myapp',
    version: '1.0.0'
});

server.use(function (req, res, next) {
    var users;

    // if (/* some condition determining whether the resource requires authentication */) {
    //    return next();
    // }

    users = {
        foo: {
            id: 1,
            password: 'bar'
        }
    };

    // Ensure that user is not anonymous; and
    // That user exists; and
    // That user password matches the record in the database.
    if (req.username == 'anonymous' || !users[req.username] || req.authorization.basic.password !== users[req.username].password) {
        // Respond with { code: 'NotAuthorized', message: '' }
        next(new restify.NotAuthorizedError());
    } else {
        next();
    }

    next();
});

我想要的是转换server.use(function (req, res, next) { ...中的功能代码块,以便我可以用这样的方式调用函数server.use(verifyAuthorizedUser(req, res, next));

所以,我所做的就是创建这个功能;

function verifyAuthorizedUser(req, res, next)
{
    var users;

    // if (/* some condition determining whether the resource requires authentication */) {
    //    return next();
    // }

    users = {
        foo: {
            id: 1,
            password: 'bar'
        }
    };

    // Ensure that user is not anonymous; and
    // That user exists; and
    // That user password matches the record in the database.
    if (req.username == 'anonymous' || !users[req.username] || req.authorization.basic.password !== users[req.username].password) {
        // Respond with { code: 'NotAuthorized', message: '' }
        next(new restify.NotAuthorizedError());
    } else {
        next();
    }

    next();
}//function verifyAuthorizedUser(req, res, next)

然后,我致电server.use(verifyAuthorizedUser(req, res, next));。不幸的是,我遇到了这个错误ReferenceError: req is not defined

3 个答案:

答案 0 :(得分:3)

你应该传递函数本身,而不是调用函数:

server.use(verifyAuthorizedUser);

编辑:更多详情:

  • verifyAuthorizedUser(req, res, next)是函数verifyAuthorizedUser调用。它的值将是该函数的返回值。并且需要定义reqresnext,而不是。{/ p>

  • 你可以写:

    server.use(function(req,res,next)
    {
        verifyAuthorizedUser(req, res, next);
    });
    

但这只是在没有充分理由的情况下添加额外的代码。

  • server.use(verifyAuthorizedUser());也是该功能的调用,您还有另外一个问题,即您没有将任何参数传递给期望某些功能的功能,因此它会显然是崩溃。

某些函数(例如restify.queryParser)可能会返回一个函数,在这种情况下,您可以调用第一个函数(使用())来获取要用作回调的函数。

答案 1 :(得分:1)

请尝试使用server.use(verifyAuthorizedUser)。这个回调函数将传递所有参数。

答案 2 :(得分:1)

您不需要在回调中解析参数。只是做

server.use(verifyAuthorizedUser)

有关详情,请查看here