TypeError Passport JS 用户名 属性 未定义
TypeError Passport JS username property undefined
我是 Reactjs 和 nodejs 的初学者,正在尝试制作我的第一个全栈应用程序。在我的 postjob 模式中,我想要 publisher 字段中当前登录用户的用户名。 Passport 有一个 req.user
命令来获取当前用户的详细信息,但每当我尝试使用它时,它都会给出类型 error.If 你们需要任何其他文件让我知道
工作后架构
const mongoose=require('mongoose')
const postjobtemplate= new mongoose.Schema({
jobtitle:{
type:String,
required:true
},
company:{
type:String,
required:true
},
officelocation:{
type:String,
required:true
},
jobtype:{
type:String,
required:true
},
publisher:{ ///<=HERE
type:String,
required:true
},
date:{
type:Date,
default:Date.now
}
})
module.exports=mongoose.model("postjobtable",postjobtemplate)
路由 js
router.post('/postjob',async(request,response,next)=>{
const postjob=new postjobtemplatecopy({
jobtitle:request.body.jobtitle,
company:request.body.company,
officelocation:request.body.officelocation,
jobtype:request.body.jobtype,
publisher:request.user.username, //////<=HERE
})
postjob.save()
.then(data=>{
response.json(data)
})
.catch(error=>{
response.json(error)
})
});
router.post("/login", (req, res, next) => {
passport.authenticate("local", (err, user, info) => {
if (err) throw err;
if (!user) res.send("No User Exists");
else {
req.logIn(user, (err) => {
if (err) throw err;
res.status(200).send("Successfully Authenticated");
});
}
})(req, res, next);
});
服务器 js
const express =require('express')
const app=express()
const mongoose=require('mongoose')
const dotenv=require('dotenv')
const routes=require('./routes/routes')
const cors=require('cors')
const passport=require("passport")
const passportlocal = require("passport-local").Strategy;
const bodyParser=require("body-parser")
const session=require("express-session")
const cookieparser=require('cookie-parser')
dotenv.config();
mongoose.connect(process.env.DB_CONNECT,{useNewUrlParser:true},()=>
console.log("database connected")
);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.use(express.urlencoded({ extended: true }));
app.use(cors({
origin:'http://localhost:3000',
credentials:true
}))
app.use(session({
secret:'secret',
resave:true,
saveUninitialized:true
}))
app.use(cookieparser("secret"))
app.use(passport.initialize());
app.use(passport.session());
require('./passport-config')(passport);
app.use(express.json())
app.use('/api',routes)
app.listen(4002,()=>console.log("server running on port 4002"))
module.exports = app;
护照配置
const User = require("./models/user");
const bcrypt = require("bcryptjs");
const localStrategy = require("passport-local").Strategy;
module.exports = function (passport) {
passport.use(
new localStrategy((username, password, done) => {
User.findOne({ username: username }, (err, user) => {
if (err) throw err;
if (!user) return done(null, false);
bcrypt.compare(password, user.password, (err, result) => {
if (err) throw err;
if (result === true) {
return done(null, user);
} else {
return done(null, false);
}
});
});
})
);
passport.serializeUser((user, cb) => {
cb(null, user.id);
});
passport.deserializeUser((id, cb) => {
User.findOne({ _id: id }, (err, user) => {
const userInformation = {
username: user.username,
};
cb(err, userInformation);
});
});
};
您收到类型错误,因为用户名 sent/received 不正确。在您的 post 路由中更改此行:publisher: request.user.username,
为此:publisher: request.body.username,
(我假设您是从前端作为用户名发送的,如果不是,将您的在你的代码中从 React 请求)这样你实际上是在接收你从前端发送的数据。此外,如果您使用用户名以外的其他字段,则需要在护照策略中指定它,如下所示:
passport.use(
"yourStrategyName", //here you are naming the strategy to be used in your route
new localStrategy( {
usernameField: "publisher", //here you are telling passport to use "publisher" as a username
},(publisher, password, done) => {
User.findOne({ publisher }, (err, user) => { //changed to the field name in database
if (err) throw err;
if (!user) return done(null, false);
bcrypt.compare(password, user.password, (err, result) => {
if (err) throw err;
if (result === true) {
return done(null, user);
} else {
return done(null, false);
}
});
});
})
);
在你的route.js中:
router.post("/login", (req, res, next) => {
passport.authenticate("yourStrategyName", (err, user, info) => { //include the strategy name as the first parameter
if (err) throw err;
if (!user) res.send("No User Exists");
else {
req.logIn(user, (err) => {
if (err) throw err;
res.status(200).send("Successfully Authenticated");
});
}
})(req, res, next);
});
我是 Reactjs 和 nodejs 的初学者,正在尝试制作我的第一个全栈应用程序。在我的 postjob 模式中,我想要 publisher 字段中当前登录用户的用户名。 Passport 有一个 req.user
命令来获取当前用户的详细信息,但每当我尝试使用它时,它都会给出类型 error.If 你们需要任何其他文件让我知道
工作后架构
const mongoose=require('mongoose')
const postjobtemplate= new mongoose.Schema({
jobtitle:{
type:String,
required:true
},
company:{
type:String,
required:true
},
officelocation:{
type:String,
required:true
},
jobtype:{
type:String,
required:true
},
publisher:{ ///<=HERE
type:String,
required:true
},
date:{
type:Date,
default:Date.now
}
})
module.exports=mongoose.model("postjobtable",postjobtemplate)
路由 js
router.post('/postjob',async(request,response,next)=>{
const postjob=new postjobtemplatecopy({
jobtitle:request.body.jobtitle,
company:request.body.company,
officelocation:request.body.officelocation,
jobtype:request.body.jobtype,
publisher:request.user.username, //////<=HERE
})
postjob.save()
.then(data=>{
response.json(data)
})
.catch(error=>{
response.json(error)
})
});
router.post("/login", (req, res, next) => {
passport.authenticate("local", (err, user, info) => {
if (err) throw err;
if (!user) res.send("No User Exists");
else {
req.logIn(user, (err) => {
if (err) throw err;
res.status(200).send("Successfully Authenticated");
});
}
})(req, res, next);
});
服务器 js
const express =require('express')
const app=express()
const mongoose=require('mongoose')
const dotenv=require('dotenv')
const routes=require('./routes/routes')
const cors=require('cors')
const passport=require("passport")
const passportlocal = require("passport-local").Strategy;
const bodyParser=require("body-parser")
const session=require("express-session")
const cookieparser=require('cookie-parser')
dotenv.config();
mongoose.connect(process.env.DB_CONNECT,{useNewUrlParser:true},()=>
console.log("database connected")
);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.use(express.urlencoded({ extended: true }));
app.use(cors({
origin:'http://localhost:3000',
credentials:true
}))
app.use(session({
secret:'secret',
resave:true,
saveUninitialized:true
}))
app.use(cookieparser("secret"))
app.use(passport.initialize());
app.use(passport.session());
require('./passport-config')(passport);
app.use(express.json())
app.use('/api',routes)
app.listen(4002,()=>console.log("server running on port 4002"))
module.exports = app;
护照配置
const User = require("./models/user");
const bcrypt = require("bcryptjs");
const localStrategy = require("passport-local").Strategy;
module.exports = function (passport) {
passport.use(
new localStrategy((username, password, done) => {
User.findOne({ username: username }, (err, user) => {
if (err) throw err;
if (!user) return done(null, false);
bcrypt.compare(password, user.password, (err, result) => {
if (err) throw err;
if (result === true) {
return done(null, user);
} else {
return done(null, false);
}
});
});
})
);
passport.serializeUser((user, cb) => {
cb(null, user.id);
});
passport.deserializeUser((id, cb) => {
User.findOne({ _id: id }, (err, user) => {
const userInformation = {
username: user.username,
};
cb(err, userInformation);
});
});
};
您收到类型错误,因为用户名 sent/received 不正确。在您的 post 路由中更改此行:publisher: request.user.username,
为此:publisher: request.body.username,
(我假设您是从前端作为用户名发送的,如果不是,将您的在你的代码中从 React 请求)这样你实际上是在接收你从前端发送的数据。此外,如果您使用用户名以外的其他字段,则需要在护照策略中指定它,如下所示:
passport.use(
"yourStrategyName", //here you are naming the strategy to be used in your route
new localStrategy( {
usernameField: "publisher", //here you are telling passport to use "publisher" as a username
},(publisher, password, done) => {
User.findOne({ publisher }, (err, user) => { //changed to the field name in database
if (err) throw err;
if (!user) return done(null, false);
bcrypt.compare(password, user.password, (err, result) => {
if (err) throw err;
if (result === true) {
return done(null, user);
} else {
return done(null, false);
}
});
});
})
);
在你的route.js中:
router.post("/login", (req, res, next) => {
passport.authenticate("yourStrategyName", (err, user, info) => { //include the strategy name as the first parameter
if (err) throw err;
if (!user) res.send("No User Exists");
else {
req.logIn(user, (err) => {
if (err) throw err;
res.status(200).send("Successfully Authenticated");
});
}
})(req, res, next);
});