“TypeError:User.serializeUser 不是函数”与 Passport.js

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

我是passport JS的新手,我正在passport中制作我的第一个程序,我的主目录中有app.js,主目录内的models目录中有user.js。 当我尝试运行命令 node app.js 时,我收到以下错误。

C:\Users\RAJ\Desktop\webD\auth\app.js:26
passport.serializeUser(User.serializeUser()); //encrypt
                            ^

TypeError: User.serializeUser is not a function
    at Object.<anonymous> (C:\Users\RAJ\Desktop\webD\auth\app.js:26:29)
    at Module._compile (module.js:660:30)
    at Object.Module._extensions..js (module.js:671:10)
    at Module.load (module.js:573:32)
    at tryModuleLoad (module.js:513:12)
    at Function.Module._load (module.js:505:3)
    at Function.Module.runMain (module.js:701:10)
    at startup (bootstrap_node.js:193:16)
    at bootstrap_node.js:617:3

以下是我的两个文件app.js和user.js。

app.js

var express               = require('express'),
mongoose              = require('mongoose'),
bodyParser            = require('body-parser'),
passport              = require('passport'),
User                  = require('./models/user'),
localStrategy         = require('passport-local'),
passportLocalMongoose = require('passport-local-mongoose');

mongoose.connect("mongodb://localhost/auth_demo");

 var app = express();
 app.set('view engine','ejs');
app.get("/",function(req,res){
res.render("home");
});
app.use(require("express-session")({
     secret : "some random shit",
     resave: false,
    saveUninitialized: false
}));
//setting up passport
app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(User.serializeUser()); //encrypt
passport.deserializeUser(User.deserializeUser()); //decrypt
app.get("/secret",function(req,res)
{
  res.render("secret");
});
 app.get("/register",function(req,res)
 {
    res.render("register");
 });
app.listen(8000,function(){
    console.log("server has started running");
});

用户.js

var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");

var UserSchema = new mongoose.Schema({
    username: String,
    password: String
});

UserSchema.plugin(passportLocalMongoose);

module.export = mongoose.model("User",UserSchema);

下面是我安装的package.json中的依赖项列表。

 "dependencies": {
    "body-parser": "^1.18.2",
    "ejs": "^2.5.7",
    "express": "^4.16.2",
    "express-session": "^1.15.6",
    "mongoose": "^5.0.8",
    "passport": "^0.4.0",
    "passport-local": "^1.0.0",
    "passport-local-mongoose": "^5.0.0"
  }
javascript node.js passport.js passport-local
6个回答
5
投票

导出模块错误的是:

不是 module.export

module.export = mongoose.model("User",UserSchema);

但是是 module.exports

module.exports = mongoose.model("User", UserSchema);

2
投票

您需要构建自己的serializeuser()和deserializeUser()函数。

serializeUser 用于在会话中存储用户的 id,而 deserializeUser 用于通过从会话中获取 id,然后从数据库中获取整个用户详细信息来检索用户的用户详细信息。示例:

passport.serializeUser(function(req, user, done) {
    done(null, user.user_id);
});



passport.deserializeUser(function(user_id, done) {
    getUserInfo(user_id).then(function(user) {
        return done(null, user);
    }, function(err) {
        return done(err,null);
    });
});

0
投票

这个 app.js 和我一起尝试一下,我认为它和你的语法相同

    var express = require("express");
    var mongoose = require("mongoose");
    var passport = require("passport");
    var bodyParser = require("body-parser");
    var localStrategy = require("passport-local");
    var passportLocalMongoose = require("passport-local-mongoose");
    var User = require("./models/user.js");
    var app = express();
    app.use(require("express-session")({
        secret: "this is a secret message",
        resave: false,
        saveUninitialized: false,
    }))
    app.set("view engine", "ejs");
    app.use(express.static(__dirname + "/public"));
    app.use(bodyParser.urlencoded({ extended: true })) 
    app.use(bodyParser.json())
    app.use(passport.initialize())
    app.use(passport.session())
    mongoose.connect("mongodb://localhost/auth", {useNewUrlParser: true, useUnifiedTopology: true});

    // passport.serializeUser(User.serializeUser())
    // passport.deserializeUser(User.desrializeUser())
    passport.serializeUser(User.serializeUser()); //encrypt
    passport.deserializeUser(User.deserializeUser()); //decrypt

    app.get("/", function(req, res){
        res.render("home")
    });

    app.get("/secret", function(req, res){
        res.render("secret")
    })

    app.listen(3000, function(){
        console.log("server started!")
    })

0
投票

// Change these lines 
passport.serializeUser(User.serializeUser()); //encrypt
passport.deserializeUser(User.deserializeUser()); //decrypt

// With these lines
passport.serializeUser(function (user, done) {
  done(null, user.id);
});

passport.deserializeUser(function (id, done) {
  User.findById(id, function (err, user) {
    done(err, user);
  });
});


-1
投票

非常非常仔细地查看您的目录树,并确保您在 app.js 中导入了正确的文件!另外,请确保安装的版本是这些。 会起作用的


-1
投票

试试这个

app.use(expressSession({
    secret:"akdfjkjfkla kajfk kajfk kajfksajfk",
    resave:false,
    saveUninitialized:false,
}));
© www.soinside.com 2019 - 2024. All rights reserved.