Hỏi về cách sử dụng module Passport trong NodeJS???



  • Chào mọi người, mình là mem mới tham gia vào group. Mình đang làm một dự án nhỏ sử dụng NodeJS để thực hiện hóa dự án của mình.

    Hiện tại mình đang gặp một chút vấn đề với module Passport về cách mà đưa dữ liệu vài DB khi người dùng hoàn tất việc điền thông tin Sign-up.

    [nodemon] 1.19.1
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching: *.*
    [nodemon] starting `node run index.js`
    SERVER STARTED LISTENING ON PORT 2019!
    DB Connected!
    (node:8970) UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error index: heroku_wzkkq1xr.users.$local.email_1 dup key: { : null }
        at Function.create (/home/dangminhphat/Desktop/dev/dev-good-jobs/node_modules/mongodb-core/lib/error.js:43:12)
        at toError (/home/dangminhphat/Desktop/dev/dev-good-jobs/node_modules/mongodb/lib/utils.js:149:22)
        at coll.s.topology.insert (/home/dangminhphat/Desktop/dev/dev-good-jobs/node_modules/mongodb/lib/operations/collection_ops.js:859:39)
        at /home/dangminhphat/Desktop/dev/dev-good-jobs/node_modules/mongodb-core/lib/connection/pool.js:397:18
        at process._tickCallback (internal/process/next_tick.js:61:11)
    (node:8970) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
    (node:8970) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    

    Trên terminal của mình nó hiện như thế, code Sign-up user:

    const LocalStrategy = require('passport-local').Strategy
    const bcrypt = require('bcryptjs')
    
    const User = require('../models/user')
    
    module.exports = function (passport) {
        // Used to serialize the user for the session
        passport.serializeUser((user, done) => {
            done(null, user.id)
        })
        // Used to deserialize the user
        passport.deserializeUser((id, done) => {
            User.findById(id).then((user) => {
                if (user) {
                    done(null, user.get())
                } else {
                    done(user.errors, null)
                }
            })
        })
        // === LOCAL SIGNUP
        passport.use('local-signup', new LocalStrategy({
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback: true,
        }, (req, email, password, done) => {
            const generateHash = (password) => {
                bcrypt.hashSync(password, bcrypt.genSaltSync(10), null)
            }
            User.findOne({ email: email }).then((user) => {
                if (user) {
                    return done(null, false, req.flash('signupMessage', 'Email đã tồn tại hoặc không đúng, vui lòng thử lại.'))
                } else {
                    const userPassword = generateHash(password)
                    const data = {
                        user_type: req.body.user_type,
                        full_name: req.body.full_name,
                        display_name: req.body.display_name,
                        email: email,
                        password: req.body.password,
                        password_confirm: req.body.password,
                    }
                    // const user = new User(req.body)
                    // user.user_type = req.body.user_type
                    // user.full_name = req.body.full_name
                    // user.display_name = req.body.display_name
                    // user.password = userPassword
                    // user.password_confirm = userPassword
                    User.create(data).then((newUser, created) => {
                        if (!newUser) {
                            return done(null, false, req.flash('signupMessage', 'Bạn đã đăng ký, xin hãy dăng nhập!'))
                        }
                        if (newUser) {
                            return done(null, newUser, req.flash('signupMessage', 'Bạn đã đăng ký thành công.'))
                        }
                    })
                }
            })
        }))
    }
    

    Mong được các cao nhân cho mình thêm ý kiến để mình có thể suy nghĩ thêm solution để xử lý vấn đề trên ạ...

    Xin cảm ơn
    Phát!


  • Global Moderator

    @PHAT-MINH said in Hỏi về cách sử dụng module Passport trong NodeJS???:

    UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error index: heroku_wzkkq1xr.users.$local.email_1 dup key

    Đây là lỗi lưu dữ liệu phía Mongo rồi. Bạn đọc sẽ thấy nó báo lỗi duplicate key trường email. Bạn thay bằng email khác xem nhé!



  • Hi @Vũ , mình đã thử thay đổi nhưng vẫn về kết quả đấy.... :(



  • Bên model của mình:

    const mongoose = require('mongoose')
    
    const { Schema } = mongoose
    
    const userSchema = new Schema({
        user_type: { type: String, required: true, trim: true },
        full_name: { type: String, required: true, trim: true, maxlength: 250 },
        display_name: { type: String, required: true, trim: true, maxlength: 50 },
        email: { type: String, unique: true, required: true, trim: true },
        password: { type: String, required: true, trim: true, minlength: 6 },
        password_confirm: { type: String, required: true, trim: true, minlength: 6 },
        date: { type: Date, default: Date.now },
    })
    
    const User = mongoose.model('user', userSchema)
    module.exports = User
    

  • Global Moderator

    @PHAT-MINH bạn follow theo một hướng dẫn hoàn chỉnh xem khác với code nghiệp vụ của mình nhé. Bạn có thể tham khảo link dưới đây

    Mà strategy bạn đang thiết lập dùng để login chứ nhỉ? Mình thấy chưa hợp lý.



  • @Vũ said in Hỏi về cách sử dụng module Passport trong NodeJS???:

    strategy

    Ok, để mình check lại xem. Cảm ơn @Vũ


Log in to reply