NodeJs 应用程序中的 400 错误请求
400 Bad Request in NodeJs Application
每当我提交一个用于登录或注册的发件人时,我都会收到 400 个错误请求。但是在注册路由中,用户注册了,但它也给出了错误的请求。当我们转到与注册路由相同的登录路由时,我收到错误请求。 0
我正在使用以下依赖项:
express session
passport
passport-local
passport-local-mongoose
passport-local-mongoose
或其 passport
方或 serialize
或 deserialize
用户的实施是否有问题。谁能帮我解决这个问题我已经坚持了三天了。这是一些代码。
//-----------------------//Require---------------------
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const ejs = require("ejs");
const session = require("express-session");
const passport = require("passport");
const LocalStrategy= require("passport-local").Strategy;
const passportLocalMongoose = require("passport-local-mongoose");
const mongoose = require("mongoose");
//-----------------------//App.use---------------------
app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}));
//-----------------------//Passport---------------------
app.use(passport.initialize());
app.use(passport.session());
//-----------------------//Mongoose---------------------
mongoose.connect('mongodb://localhost/Twitter', {useNewUrlParser: true, useUnifiedTopology: true});
mongoose.set('useCreateIndex', true);
const tweetschema = new mongoose.Schema({
username: String,
password: String,
tweets: String
});
//-----------------------//Schema Plgin---------------------
tweetschema.plugin(passportLocalMongoose);
//-----------------------//New Model---------------------
const Tweet = new mongoose.model("Tweet", tweetschema);
//-----------------------//Local Strategy-------------------
passport.use(new LocalStrategy(Tweet.authenticate()));
//-----------------------//Seralize Passport---------------------
passport.serializeUser(Tweet.serializeUser());
passport.deserializeUser(Tweet.deserializeUser());
//-----------------------//Get Routes---------------------
app.get("/" ,(req, res)=>{
Tweet.find({}, function(err, founItems){
res.render("home", {founItems:founItems});
});
});
app.get("/tweets", (req, res)=>{
if(req.isAuthenticated()){
res.render("Tweets");
}else{
res.redirect("/login");
}
});
//-----------------------//Post Routes---------------------
app.post("/login", (req, res)=>{
const user = new Tweet({
username: req.body.email,
password: req.body.password
});
req.logIn(user, (err)=>{
if(err){
res.send(err);
}
passport.authenticate("local")(req, res, ()=>{
console.log("Successfull.");
})
})
});
app.post("/reg", (req, res)=>{
Tweet.register({username: req.body.email}, req.body.password, (err, user)=>{
if(err){
console.log(err);
res.redirect("/reg");
}else{
if(user){
passport.authenticate("local")(req, res, ()=>{
res.redirect("/tweets");
console.log("Successfully Regsitered The User!");
})
}
}
})
})
您将用户重定向到 /login 路由,但您没有为此获取请求。
如果您有但未上传,请在 Seralize Passport 中尝试此操作
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
这个怎么样:
app.post("/login", (req, res) => {
const email = req.body.email;
User.findOne({ username: email }, function (err, u) {
if (err) {
console.log(err);
} else {
if (u) {
u.authenticate(req.body.password, (err, model, info) => {
if (info) {
res.send("Wrong email or password!");
}
if (err) {
console.log(err);
} else if (model) {
req.login(u, (err) => {
if (err) {
console.log(err);
} else {
passport.authenticate("local");
req.session.save((error) => {
if (err) {
console.log(err);
} else {
res.redirect("/");
}
});
}
});
}
});
} else {
res.send("Wrong email or password!");
}
}
});
});
因此您首先使用电子邮件在数据库中搜索用户:User.findOne({ username: email }, function (err, u){}
我建议在 tweetSchema
中使用户名唯一 username: { type: String, unique: true}
。
之后检查 err
。如果 u
存在,则使用密码对其进行身份验证。根据 passport-local-mongoose- u.authenticate(password, (err, model, info)=>{})
有两个参数:密码和回调函数。在回调中,我们检查 info
,它是“描述密码失败原因的 AuthenticationError 实例,否则未定义。”之后我们检查 err
并且它是“null unless the hashing algorithm throws an error”。最后,我们检查 model
,即“如果身份验证成功则模型获得身份验证,否则为假。”
因此,模型已通过身份验证。之后我们必须使用 req.login(u,(err))
的用户。检查错误,如果一切正常,我们将在本地验证用户 passport.authenticate("local");
。如果要保存session,写:
req.session.save((error) => {
if (err) {
console.log(err);
} else {
res.redirect("/");
}
});
就这些了。
报名:
app.post("/register", (req, res) => {
const email = req.body.email;
const password = req.body.password
User.find({ email: email }, function (err, docs) {
if (docs.length === 0) {
User.register(
{
username: email,
},
password,
function (err, user) {
if (err) {
console.log(err);
} else {
req.login(user, (err) => {
if (err) {
console.log(err);
} else {
passport.authenticate("local");
req.session.save((error) => {
if (err) {
console.log(err);
} else {
res.redirect("/");
}
});
}
});
}
}
);
} else {
res.send("The accout already exists!");
}
});
});
每当我提交一个用于登录或注册的发件人时,我都会收到 400 个错误请求。但是在注册路由中,用户注册了,但它也给出了错误的请求。当我们转到与注册路由相同的登录路由时,我收到错误请求。 0
我正在使用以下依赖项:
express session
passport
passport-local
passport-local-mongoose
passport-local-mongoose
或其 passport
方或 serialize
或 deserialize
用户的实施是否有问题。谁能帮我解决这个问题我已经坚持了三天了。这是一些代码。
//-----------------------//Require---------------------
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const ejs = require("ejs");
const session = require("express-session");
const passport = require("passport");
const LocalStrategy= require("passport-local").Strategy;
const passportLocalMongoose = require("passport-local-mongoose");
const mongoose = require("mongoose");
//-----------------------//App.use---------------------
app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}));
//-----------------------//Passport---------------------
app.use(passport.initialize());
app.use(passport.session());
//-----------------------//Mongoose---------------------
mongoose.connect('mongodb://localhost/Twitter', {useNewUrlParser: true, useUnifiedTopology: true});
mongoose.set('useCreateIndex', true);
const tweetschema = new mongoose.Schema({
username: String,
password: String,
tweets: String
});
//-----------------------//Schema Plgin---------------------
tweetschema.plugin(passportLocalMongoose);
//-----------------------//New Model---------------------
const Tweet = new mongoose.model("Tweet", tweetschema);
//-----------------------//Local Strategy-------------------
passport.use(new LocalStrategy(Tweet.authenticate()));
//-----------------------//Seralize Passport---------------------
passport.serializeUser(Tweet.serializeUser());
passport.deserializeUser(Tweet.deserializeUser());
//-----------------------//Get Routes---------------------
app.get("/" ,(req, res)=>{
Tweet.find({}, function(err, founItems){
res.render("home", {founItems:founItems});
});
});
app.get("/tweets", (req, res)=>{
if(req.isAuthenticated()){
res.render("Tweets");
}else{
res.redirect("/login");
}
});
//-----------------------//Post Routes---------------------
app.post("/login", (req, res)=>{
const user = new Tweet({
username: req.body.email,
password: req.body.password
});
req.logIn(user, (err)=>{
if(err){
res.send(err);
}
passport.authenticate("local")(req, res, ()=>{
console.log("Successfull.");
})
})
});
app.post("/reg", (req, res)=>{
Tweet.register({username: req.body.email}, req.body.password, (err, user)=>{
if(err){
console.log(err);
res.redirect("/reg");
}else{
if(user){
passport.authenticate("local")(req, res, ()=>{
res.redirect("/tweets");
console.log("Successfully Regsitered The User!");
})
}
}
})
})
您将用户重定向到 /login 路由,但您没有为此获取请求。
如果您有但未上传,请在 Seralize Passport 中尝试此操作
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
这个怎么样:
app.post("/login", (req, res) => {
const email = req.body.email;
User.findOne({ username: email }, function (err, u) {
if (err) {
console.log(err);
} else {
if (u) {
u.authenticate(req.body.password, (err, model, info) => {
if (info) {
res.send("Wrong email or password!");
}
if (err) {
console.log(err);
} else if (model) {
req.login(u, (err) => {
if (err) {
console.log(err);
} else {
passport.authenticate("local");
req.session.save((error) => {
if (err) {
console.log(err);
} else {
res.redirect("/");
}
});
}
});
}
});
} else {
res.send("Wrong email or password!");
}
}
});
});
因此您首先使用电子邮件在数据库中搜索用户:User.findOne({ username: email }, function (err, u){}
我建议在 tweetSchema
中使用户名唯一 username: { type: String, unique: true}
。
之后检查 err
。如果 u
存在,则使用密码对其进行身份验证。根据 passport-local-mongoose- u.authenticate(password, (err, model, info)=>{})
有两个参数:密码和回调函数。在回调中,我们检查 info
,它是“描述密码失败原因的 AuthenticationError 实例,否则未定义。”之后我们检查 err
并且它是“null unless the hashing algorithm throws an error”。最后,我们检查 model
,即“如果身份验证成功则模型获得身份验证,否则为假。”
因此,模型已通过身份验证。之后我们必须使用 req.login(u,(err))
的用户。检查错误,如果一切正常,我们将在本地验证用户 passport.authenticate("local");
。如果要保存session,写:
req.session.save((error) => {
if (err) {
console.log(err);
} else {
res.redirect("/");
}
});
就这些了。
报名:
app.post("/register", (req, res) => {
const email = req.body.email;
const password = req.body.password
User.find({ email: email }, function (err, docs) {
if (docs.length === 0) {
User.register(
{
username: email,
},
password,
function (err, user) {
if (err) {
console.log(err);
} else {
req.login(user, (err) => {
if (err) {
console.log(err);
} else {
passport.authenticate("local");
req.session.save((error) => {
if (err) {
console.log(err);
} else {
res.redirect("/");
}
});
}
});
}
}
);
} else {
res.send("The accout already exists!");
}
});
});