节点路由模块访问其他模块功能

时间:2014-08-24 10:12:42

标签: javascript node.js express

我尝试使用模块来处理用户注册和登录过程。我想要做的是有一个模块,例如,一个"寄存器"端点,但不是将所有代码放在一个函数中,我将其拆分为单独的部分,如validUsername,validPassword等,以检查给定的值是否可接受。

我遇到的麻烦是无论何时运行此路由,我都会收到此错误:

  

TypeError:Object#< Object>没有方法' validUsername'

server.js

var user = require('./routes/user.js')(mongoose, bcrypt);

express.post('/user', user.create);

user.js的

module.exports = function(mongoose, bcrypt){
    return {
        validUsername: function(username){
            // Ensure a username is present
            if(username == null){
                return false;
            }

            // Ensure it is at least 2 characters
            if(username.length <= 2){
                return false;
            }

            return true;
        },

        validPassword: function(password){
            // Ensure a password is present
            if(password == null){
                return false;
            }

            // Ensure it is at least 9 characters
            if(password.length < 9){
                return false;
            }

            return true;
        },

        create: function(req, res){
            // Extract the new user data from the post body
            var username = req.body.username || null;
            var password = req.body.password || null;

            // Ensure the details are acceptable
            if(!this.validUsername(username))
            {
                res.send(400,{'field':'username','error':'invalid'});
            }
            else if(!this.validPassword(password))
            {
                res.send(400,{'field':'password','error':'invalid'});
            }
            else
            {
                // ... Create new user etc ...
            }
        }
    };
};

我假设错误的原因是因为在设置路线时,只有&#39;创建&#39;函数被传入,因此它无法看到&#34;其余的功能在同一模块中。

那么如何解决这个问题并让create函数在用作路由端点时仍然可以访问这些验证函数?

1 个答案:

答案 0 :(得分:0)

修复方法是使用.bind()

express.post('/user', user.create.bind(user));

或使用包装器:

express.post('/user', function(req, res) { user.create(req, res); });