NodeJs 应用程序中的 400 错误请求

400 Bad Request in NodeJs Application

每当我提交一个用于登录或注册的发件人时,我都会收到 400 个错误请求。但是在注册路由中,用户注册了,但它也给出了错误的请求。当我们转到与注册路由相同的登录路由时,我收到错误请求。 0

我正在使用以下依赖项:

express session passport passport-local passport-local-mongoose

passport-local-mongoose 或其 passport 方或 serializedeserialize 用户的实施是否有问题。谁能帮我解决这个问题我已经坚持了三天了。这是一些代码。

//-----------------------//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!");
    }
  });
});