如何修复在猫鼬对象Id失败的强制转换错误?



我使用护照js进行谷歌身份验证,当我尝试登录页面时,我得到这个错误"CastError:转换为objecd失败的值"xxxxxxxx"(类型字符串)在路径"_id"为模型"用户"我该如何解决这个问题?

这是我的模式代码*

const {Schema,model} = require("mongoose"); 
const passportLocalMongoose = require("passport-local-mongoose"); 
const userSchema = new Schema({
username: {
type: String, 
unique: true, 
}, 
email: {
type: String, 
unique:true, 
},
googleid:{
type: String,

} 
}, {timestamps:true})
userSchema.plugin(passportLocalMongoose, { usernameField: 'email' });
module.exports = model("User", userSchema);* 

这是我的Google认证码

const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth2').Strategy
const User = require('../../database/models/user')
require('dotenv').config()
passport.serializeUser((user, done) => {
done(null, user)
console.log(user)
})
passport.deserializeUser((id, done) => {
console.log('chigala')
User.findById(id).then(user => {
done(null, user)
})
})
const params = {
clientID: process.env.GOOGLE_OAUTH_CLIENT_ID,
clientSecret: process.env.GOOGLE_OAUTH_CLIENT_SECRET,
callbackURL: 'http://localhost:5000/api/google/auth',
passcallbackURL: true
}
const Strategy = new GoogleStrategy(
params,
async (req, accessToken, refreshToken, profile, done) => {
console.log(profile)
try {
const currentUser = await User.findOne({ email: profile.emails[0].value })
if (currentUser) {
// console.log(`this is the current user:${currentUser}`)
if (currentUser.googleId) {
done(null, currentUser)
return
}
currentUser.googleId = profile.id
currentUser.save()
done(null, currentUser)
} else {
const user = await User.create({
googleId: profile.id,
email: profile.emails[0].value
})
done(null, user)
}
} catch (err) {
console.log(err)
}
}
)
passport.use(Strategy)

默认的findById方法试图将id转换为MongoDB_id格式,因此会抛出错误。在deserialize函数中,可以使用new objectId(id)将id转换为MongoDB _id格式。

const objectId= require('mongodb').ObjectId; //here
const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth2').Strategy
const User = require('../../database/models/user')
require('dotenv').config()

passport.deserializeUser((id, done) => {
console.log('chigala')
User.findById(new objectId(id)).then(user => {  //here
done(null, user)
})
})

最新更新