【发布时间】:2020-04-09 21:53:18
【问题描述】:
我在我的应用程序中添加了登录/注册功能。这些添加的功能在单独的文件夹中使用时可以完美运行,我的应用程序也可以单独使用。但是,将登录/注册功能添加到我完美运行的应用程序导致我出现此错误。当我在登录页面上输入我的详细信息并单击注册按钮(注册帐户)以在我的浏览器选项卡上收到以下消息时会发生这种情况 'Error: Cannot POST /' 。我不明白为什么会收到此错误。这是我现在正在使用的代码,它让我遇到了这个错误。我是节点 js 等的新手,所以如果这很简单,我深表歉意!我使用 MongoDB Compass Community 作为我的数据库。另外,很抱歉有很多代码,但这是使用我的登录/注册功能所需的所有代码。
控制器/employeeController.js
const express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
const Employee = mongoose.model('Employee');
const Task = require('../models/task');
var User = require('../models/user');
router.get('/login', (req, res) => {
res.render("employee/login");
});
//POST route for updating data
router.post('employee/login', function (req, res, next) {
// confirm that user typed same password twice
if (req.body.password !== req.body.passwordConf) {
var err = new Error('Passwords do not match.');
err.status = 400;
res.send("passwords dont match");
return next(err);
}
if (req.body.email &&
req.body.username &&
req.body.password &&
req.body.passwordConf) {
var userData = {
email: req.body.email,
username: req.body.username,
password: req.body.password,
}
User.create(userData, function (error, user) {
if (error) {
return next(error);
} else {
req.session.userId = user._id;
return res.redirect('/profile');
}
});
} else if (req.body.logemail && req.body.logpassword) {
User.authenticate(req.body.logemail, req.body.logpassword, function (error, user) {
if (error || !user) {
var err = new Error('Wrong email or password.');
err.status = 401;
return next(err);
} else {
req.session.userId = user._id;
return res.redirect('/profile');
}
});
} else {
var err = new Error('All fields required.');
err.status = 400;
return next(err);
}
})
// GET route after registering
router.get('/profile', function (req, res, next) {
User.findById(req.session.userId)
.exec(function (error, user) {
if (error) {
return next(error);
} else {
if (user === null) {
var err = new Error('Not authorized! Go back!');
err.status = 400;
return next(err);
} else {
return res.send('<h1>Name: </h1>' + user.username + '<h2>Mail: </h2>' + user.email + '<br><a type="button" href="/logout">Logout</a>')
}
}
});
});
// GET for logout logout
router.get('/logout', function (req, res, next) {
if (req.session) {
// delete session object
req.session.destroy(function (err) {
if (err) {
return next(err);
} else {
return res.redirect('/');
}
});
}
});
module.exports = router;
models/user.js
var mongoose = require('mongoose');
var bcrypt = require('bcrypt');
var UserSchema = new mongoose.Schema({
email: {
type: String,
unique: true,
required: true,
trim: true
},
username: {
type: String,
unique: true,
required: true,
trim: true
},
password: {
type: String,
required: true,
}
});
//authenticate input against database
UserSchema.statics.authenticate = function (email, password, callback) {
User.findOne({ email: email })
.exec(function (err, user) {
if (err) {
return callback(err)
} else if (!user) {
var err = new Error('User not found.');
err.status = 401;
return callback(err);
}
bcrypt.compare(password, user.password, function (err, result) {
if (result === true) {
return callback(null, user);
} else {
return callback();
}
})
});
}
//hashing a password before saving it to the database
UserSchema.pre('save', function (next) {
var user = this;
bcrypt.hash(user.password, 10, function (err, hash) {
if (err) {
return next(err);
}
user.password = hash;
next();
})
});
var User = mongoose.model('User', UserSchema);
module.exports = User;
server.js
require('./models/employee.model');
require('./models/task');
const express = require('express');
const path = require('path');
const exphbs = require('express-handlebars');
const bodyparser = require('body-parser');
const logger = require('morgan');
const favicon = require('serve-favicon');
var app = express();
var mongoose = require('mongoose');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost:27017/testForAuth', { useNewUrlParser: true, useCreateIndex: true, useFindAndModify: false }, (err) => {
if (!err) { console.log('MongoDB Connection Succeeded.') }
else { console.log('Error in DB connection : ' + err) }
});
var db = mongoose.connection;
//handle mongo error
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function () {
// we're connected!
});
//use sessions for tracking logins
app.use(session({
secret: 'work hard',
resave: true,
saveUninitialized: false,
store: new MongoStore({
mongooseConnection: db
})
}));
const employeeController = require('./controllers/employeeController');
var app = express();
//setting up morgan middleware
app.use(logger('dev'));
app.use(bodyparser.urlencoded({
extended: true
}));
app.use(bodyparser.json());
app.set('views', path.join(__dirname, '/views/'));
app.engine('hbs', exphbs({ extname: 'hbs', defaultLayout: 'mainLayout', layoutsDir: __dirname + '/views/layouts/' }));
app.set('view engine', 'hbs');
//serving blank favicon to keep from throwing 404 errors
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
//setting up static path for serving static files
app.use(express.static(path.join(__dirname, 'public')));
//Bringing in the routes
const index = require('./routes/index');
const api = require('./routes/api');
app.use('/', index);
app.use('/api', api);
app.listen(3000, () => {
console.log('Express server started at port : 3000');
});
app.use('/employee', employeeController.router);
views/employee/login.hbs(车把)
<!DOCTYPE html>
<html>
<head>
<title>Register Login with Authentication</title>
<!--Custom Theme files-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="Register Login Widget template Responsive, Login form web template,Flat Pricing tables,Flat Drop downs Sign up Web Templates, Flat Web Templates, Login Signup Responsive web template, SmartPhone Compatible web template, free WebDesigns for Nokia, Samsung, LG, SonyEricsson, Motorola web design" />
<script type="application/x-javascript"> addEventListener("load", function() { setTimeout(hideURLbar, 0); }, false); function hideURLbar(){ window.scrollTo(0,1); } </script>
<!-- Custom Theme files -->
<link href="css/style.css" rel="stylesheet" type="text/css" media="all" />
<!--web-fonts-->
<link href='//fonts.googleapis.com/css?family=Jura:400,300,500,600' rel='stylesheet' type='text/css'>
<!--//web-fonts-->
</head>
<body>
<h1>Test Authentication</h1>
<div class="main">
<div class="w3">
<div class="signin-form profile">
<h3>Login</h3>
<div class="login-form">
<form action="/" method="post">
<input type="text" name="logemail" placeholder="E-mail" required="">
<input type="password" name="logpassword" placeholder="Password" required="">
<div class="tp">
<input type="submit" value="LOGIN NOW">
</div>
</form>
</div>
</div>
</div>
<div class="agile">
<div class="signin-form profile">
<h3>Register</h3>
<div class="login-form">
<form id="login" action="/" method="post" onsubmit="event.preventDefault(); validateMyForm();">
<input type="text" name="email" placeholder="E-mail" required="">
<input type="text" name="username" placeholder="Username" required="">
<input type="password" name="password" placeholder="Password" id="password" required="" >
<input type="password" name="passwordConf" placeholder="Confirm Password" id="password_conf" required="">
<input type="submit" value="REGISTER">
</form>
</div>
<p><a href="#"> By clicking register, I agree to your terms</a></p>
</div>
</div>
<div class="clear"></div>
<!--//signin-form-->
</div>
<script type="text/javascript">
var passWordField = document.getElementById('password')
var passWordConfirmField = document.getElementById('password_conf')
var form = document.getElementById('login')
function validateMyForm(){
if(passWordField.value != passWordConfirmField.value){
alert("Passwords do not match. Please try again.");
} else {
form.submit()
}
}
</script>
</body>
</html>
【问题讨论】:
-
“这些添加的功能,在单独的文件夹中使用时可以完美运行”你的意思是你可以注册吗?
-
@JorgePires 对不起豪尔赫!我的意思是我有一个文件夹,例如“loginmongo”,其中包含控制器文件、模型、服务器等,我可以正常运行(我可以登录、注册等)。但是,我有一个结合了 CRUD 和 TODO 的应用程序,但在进入该应用程序之前我想要一个登录/注册功能。那么两个独立的应用程序,但如果有意义就合并?
-
@JorgePires 另外,是的,上面的代码是我将登录和注册等应用到我的其他应用程序,但出现此错误。当我在他们单独的文件夹/不同的应用程序中使用登录/注册功能时,我没有。
-
“当我在登录页面输入我的详细信息并单击注册按钮时会发生这种情况”注册路径在哪里?
-
我相信它在这里
router.post('employee/login', function (req, res, next)。对吗?
标签: javascript node.js mongodb express mongoose