Javascript “哈希”字符串不是函数

Javascript “哈希”字符串不是函数,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,有人能告诉我为什么我不能通过这里的登录页面吗 app.configure(function() { this.engine('ejs', require('ejs-locals')); this.set('views', path.join(__dirname, 'views')); this.set('view engine', 'ejs'); this.use(express.static(path.join(__dirname, '/public')));

有人能告诉我为什么我不能通过这里的登录页面吗

app.configure(function() {
    this.engine('ejs', require('ejs-locals'));
    this.set('views', path.join(__dirname, 'views'));
    this.set('view engine', 'ejs');
    this.use(express.static(path.join(__dirname, '/public')));
    this.use(express.static(path.join(__dirname, '/views/login')));
    this.use(express.static(path.join(__dirname, '/views/el')));
    // Allow parsing cookies from request headers
    this.use(express.cookieParser());

    this.use(express.session({
        "secret": sessionSecret,
        "store": sessionStore
    }));
    // Allow parsing form data
    this.use(express.bodyParser());
});
app.configure('development', function() {
    this.use(express.errorHandler({
        dumpExceptions: true,
        showStack: true
    }));
});
app.configure('production', function() {
    this.use(express.errorHandler());
});

function authenticate(name, password, fn) {
    if (!module.parent) console.log('authenticating %s:%s', name, password);

    User.findOne({
            username: name
        },

        function(err, user) {
            if (user) {
                if (err) return fn(new Error('cannot find user'));
                hash(password, user.salt, function(err, hash) {
                    if (err) return fn(err);
                    if (hash == user.hash) return fn(null, user);
                    fn(new Error('invalid password'));
                });
            } else {
                return fn(new Error('cannot find user'));
            }
        });

}

function requiredAuthentication(req, res, next) {
    if (req.session.user) {
        next();
    } else {
        req.session.error = 'Access denied!';
        res.redirect('/login');
    }
}

function userExist(req, res, next) {
    User.count({
        username: req.body.username
    }, function(err, count) {
        if (count === 0) {
            next();
        } else {
            req.session.error = "User Exists"
            res.redirect("/signup");
        }
    });
}

//Routes

app.get("/", function(req, res) {

    if (req.session.user) {
        res.send("Welcome " + req.session.user.username + "<br>" + "<a href='/logout'>logout</a>");
    } else {
        res.render("./login/login");
    }
});

app.get("/signup", function(req, res) {
    if (req.session.user) {
        res.redirect("/");
    } else {
        res.render("./login/Signup");
    }
});

app.post("/signup", userExist, function(req, res) {
    var password = req.body.password;
    var username = req.body.username;

    hash(pass, function(err, salt, hash) {
        if (err) throw err;
        var user = new User({
            username: username,
            salt: salt,
            hash: hash,
        }).save(function(err, newUser) {
            if (err) throw err;
            authenticate(newUser.username, password, function(err, user) {
                if (user) {
                    req.session.regenerate(function() {
                        req.session.user = user;
                        req.session.success = 'Authenticated as ' + user.username + ' click to <a href="/logout">logout</a>. ' + ' You may now access <a href="/">/</a>.';
                        res.redirect('/');
                    });
                }
            });
        });
    });
});

app.get("/login", function(req, res) {
    res.render("./login/login");
});

app.post("/login", function(req, res) {
    authenticate(req.body.username, req.body.password, function(err, user) {
        if (user) {

            req.session.regenerate(function() {

                req.session.user = user;
                req.session.success = 'Authenticated as ' + user.username + ' click to <a href="/logout">logout</a>. ' + ' You may now access <a href="/restricted">/restricted</a>.';
                res.redirect('/');
            });
        } else {
            req.session.error = 'Authentication failed, please check your ' + ' username and password.';
            res.redirect('/login');
        }
    });
});

app.get('/logout', function(req, res) {
    req.session.destroy(function() {
        res.redirect('/');
    });
});

app.get('/profile', requiredAuthentication, function(req, res) {
    res.send('Profile page of ' + req.session.user.username + '<br>' + ' click to <a href="/logout">logout</a>');
});
“我的节点”提示符显示以下内容:

/home/ghanem/server/www/server.js:210
           hash(password, user.salt, function (err, hash) {
           ^ TypeError: string is not a function
    at /home/ghanem/server/www/server.js:210:12
    at /home/ghanem/server/www/node_modules/mongoose/lib/query.js:1170:16
    at /home/ghanem/server/www/node_modules/mongoose/node_modules/kareem/index.js:103:16
    at process._tickCallback (node.js:415:13)

在作为函数调用时,哈希似乎已改为字符串。我看到你在用户对象中使用散列作为密钥,如果你将该值重命名为其他值会发生什么?你期望散列是什么,它来自哪里?@AnthonyForloney:当我将散列更改为散列1并重新启动服务器,当我单击登录时,我保持在同一页面上。我不再得到错误页面,但我也没有被重定向到任何地方。可能是我的路线不正确吗?这可能是一种可能性,但不幸的是,在不知道配置的情况下,我无法就此发言。
/home/ghanem/server/www/server.js:210
           hash(password, user.salt, function (err, hash) {
           ^ TypeError: string is not a function
    at /home/ghanem/server/www/server.js:210:12
    at /home/ghanem/server/www/node_modules/mongoose/lib/query.js:1170:16
    at /home/ghanem/server/www/node_modules/mongoose/node_modules/kareem/index.js:103:16
    at process._tickCallback (node.js:415:13)