为什么要正确遵循Express。的passport.js文档后收到类型错误“未定义的用户名?”>

问题描述 投票:0回答:1

在搜索了多个相同问题的答案之后,没有一个答案对我有用。所以我希望我能得到一些帮助。在Routes / profile.js中,我向localhost:8081 / profile发出了get请求,这给了我错误。我正在使用Express和mongodb。

server.js

注意:

  • authRoutes和profileRoutes用作路由的中间件
const express = require("express");
const app = express();
const authRoutes = require("./routes/authorize");
const profileRoutes = require("./routes/profile");
require("dotenv/config");
const PORT = process.env.PORT || 8081;
const cors = require("cors");
const morgan = require("morgan");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const cookieSession = require("cookie-session");
const passport = require("passport");
const keys = require("./config/key.js");
const passportSetup = require("./config/passport.js");

app.use("/auth", authRoutes);
app.use("/profile", profileRoutes);
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
//Initialize passport
app.use(passport.initialize());
app.use(passport.session());
app.use(
  cookieSession({
    maxAge: 24 * 60 * 60 * 1000,
    keys: [keys.session.cookieKey]
  })
);
app.use(cors());
app.use(morgan("combined"));

mongoose.connect(
  process.env.DB_CONNECTION,
  {
    useNewUrlParser: true,
    useUnifiedTopology: true
  },
  () => console.log("mongo atlas")
);

app.listen(PORT, () => {
  console.log(`Server is on port ${PORT}`);
});

passport.js

const passport = require("passport");
const GoogleStratedy = require("passport-google-oauth20");
const keys = require("./key.js");
const User = require("../models/userModel");

passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser((id, done) => {
  User.findById(id).then(user => {
    done(null, user);
  });
});

passport.use(
  new GoogleStratedy(
    {
      //options for the google strategy

      callbackURL: "/auth/google/redirect",
      clientID: keys.google.clientID,
      clientSecret: keys.google.clientSecret
    },
    (accessToken, refreshToken, profile, done) => {
      //passport callback function
      console.log("passport callback fired");

      //Check if user already exist in Db
      User.findOne({ googleId: profile.id }).then(currentUser => {
        if (currentUser) {
          //already have user
          console.log(`user is: ${currentUser} ALREADY REGISTERED`);
          done(null, currentUser);
        } else {
          //create new user
          new User({
            username: profile.displayName,
            googleId: profile.id
          })
            .save()
            .then(newUser => {
              console.log(`new user created ${newUser}`);
              done(null, newUser);
            });
        }
      });
    }
  )
);

Routes / authorize.js

const express = require("express");
const router = express.Router();
const passport = require("passport");

//auth login
router.get("/login", (req, res) => {
  res.send({
    message: `Hello ${req.body.email}! Your user was registered`
  });
});

//auth logout
router.get("/logout", (req, res) => {
  res.send("it works");
});

//auth with google
router.get(
  "/google",
  passport.authenticate("google", {
    scope: ["profile"]
  })
);

router.get("/google/redirect", passport.authenticate("google"), (req, res) => {
  res.redirect("/profile");
});

module.exports = router;

Routes / profile.js这是用于重定向api

const router = require("express").Router();
const passport = require("passport");

router.get("/", (req, res) => {
  console.log(req.user.username);
});

module.exports = router;

userModel.js

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const userSchema = new Schema({
  username: String,
  googleId: String
});

const User = mongoose.model("user", userSchema);

module.exports = User;

在搜索了多个相同问题的答案之后,没有一个答案对我有用。所以我希望我能得到一些帮助。在Routes / profile.js中,我向本地主机发出了一个get请求:...

node.js express authentication oauth passport.js
1个回答
0
投票

注册护照中间件之前,您需要注册填充cookieSession的会话中间件(在您的情况下为req.session)。因此,您必须将代码的顺序更改为此:

© www.soinside.com 2019 - 2024. All rights reserved.