我是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"
}
导出模块错误的是:
不是 module.export
module.export = mongoose.model("User",UserSchema);
但是是 module.exports
module.exports = mongoose.model("User", UserSchema);
您需要构建自己的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);
});
});
这个 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!")
})
// 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);
});
});
试试这个
app.use(expressSession({
secret:"akdfjkjfkla kajfk kajfk kajfksajfk",
resave:false,
saveUninitialized:false,
}));