我正在尝试使用Express从Mongoose获取一些数据。我已创建用户名和密码表单以登录我的网站。它应该检查凭据并让它们进入,如果凭据与存储在数据库中的凭据相同,但它允许任何内容(即使我输入了错误的密码)。我的源文件似乎很好,控制台没有丢失任何错误。文件的要点如下:
app.js文件(由于我的声誉,不能说出来):
var bodyParser = require('body-parser');
var express = require('express');
var mongoose = require('mongoose');
var app = express();
var options = {
server: {
socketOptions: {
keepAlive: 300000, connectTimeoutMS: 30000
}
},
replset: {
socketOptions: {
keepAlive: 300000,
connectTimeoutMS : 30000
}
}
};
var db = mongoose.connect('db_uri', options);
var Schema = mongoose.Schema;
var UserSchema = new Schema({
email: String,
password: String
});
var User = mongoose.model('Users', UserSchema);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(__dirname+'/public'));
app.set('view engine', 'ejs');
app.set('views', __dirname+'/public/templates');
app.get('/', function (req, res) {
res.render('index');
});
app.get('/registerPage', function (req, res) {
res.render('register') ;
});
app.get('/loginPage', function (req, res) {
res.render('login');
});
app.post('/register', function (req, res) {
var email = req.body.email;
var password = req.body.password;
var user = new User({
email: email,
password: password
});
user.save(function (err) {
if (err) throw err;
console.dir(user);
res.send('Account created successfully (email): ' + email);
});
});
app.post('/login', function (req, res) {
var email = req.body.email;
var password = req.body.password;
User.findOne( {email: email, password: password}, function (err) {
if (err) throw err;
res.render('portal');
});
});
app.listen(3000, function () {
console.log('Express server listening on http://localhost:3000');
});
感谢您的帮助!
答案 0 :(得分:2)
在登录处理程序中,您实际上并未检查查询是否与用户匹配。
也许您认为在这种情况下会设置err
,但它不会成功,因为查询本身已成功执行(它只是没有返回任何记录)。
您需要添加额外的检查以查看查询是否返回了有效用户:
User.findOne( {email: email, password: password}, function (err, user) {
if (err) throw err;
if (! user) return res.send(401);
res.render('portal');
});
当查询与用户不匹配时,这将返回401("未授权")。