首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复对象Id在猫鼬中失败的强制转换错误?

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

Stack Overflow用户
提问于 2022-05-07 00:27:35
回答 1查看 248关注 0票数 0

我将护照js用于google身份验证,当我尝试登录页面时,在路径"_id“(模型”User“)的值"xxxxxxxx”(类型string)上出现"CastError:强制转换为ObjectId失败“的错误。我怎么才能解决这个问题?

这是我的模式代码*

代码语言:javascript
复制
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认证代码

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2022-05-11 06:40:28

默认的findById方法尝试将id转换为MongoDB _id格式,从而引发错误。在deserialize函数中,可以使用new objectId(id)将id转换为MongoDB _id格式。

代码语言:javascript
复制
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)
  })
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72148561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档