Обновить или добавить поля в local-strategy Паспорт. Js?

Я просмотрел всю документацию, но, похоже, не могу найти способ обновить учетные данные.

Это то, что я смог уловить, проанализировав код.

passport.deserializeUser(function(id, done) {
    AppUser.findById(id, function(err, user) {
        done(err, user);
    });
});

DeserializeUser кажется полезным, но я не уверен, как использовать его для обновления или добавления полей?

Я пытался взломать и скопировать логику логина и разобраться в ней.

passport.use('local-update', new LocalStrategy({
    usernameField : 'username',
    passReqToCallback : true
},
function(req, username, done) {

    console.log(req)
    // asynchronous
    // AppUser.findOne wont fire unless data is sent back
    // process.nextTick(function() {

    //     // find a user whose email is the same as the forms email
    //     // we are checking to see if the user trying to login already exists
    //     AppUser.findOne({ 'local.email' :  email }, function(err, user) {
    //         // if there are any errors, return the error
    //         if (err)
    //             return done(err);

    //         // check to see if theres already a user with that email
    //         if (!user) {
    //             //return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
    //             return done(null, false);
    //         } else {

    //             // if there is a user with that email
    //             // create the username
    //             var updateUser = new AppUser();

    //             // set the user's local credentials
    //             newUser.local.email    = email;
    //             newUser.local.password = newUser.generateHash(password);

    //             // save the user
    //             newUser.update(function(err) {
    //                 if (err)
    //                     throw err;
    //                 return done(null, newUser);
    //             });
    //         }

    //     });    

    // });

}));

Затем в форме отправки я сделал это.

app.post('/profile', passport.authenticate('local-update', {
    successRedirect : '/', // redirect to the secure profile section
    failureRedirect : '/signup' // redirect back to the signup page if there is an error
    //failureFlash : true // allow flash messages
}));

Это приводит к сбою перенаправления.

Это не работает, потому что нет ответа, но мне нужно найти модель в mongoDB. Сначала я пытаюсь увидеть запрос в консоли, чтобы, возможно, я мог увидеть, как найти модель, но ничего не отображается.

Очевидно HACKISH код выше, но это лучшее, что я мог сделать. Мне нужен конкретный ответ, я уверен, что он простой, и мне его не хватает в документации!

Изменить: Идея здесь в том, что когда пользователь регистрируется / входит в систему, он предоставляет электронное письмо. После того, как пользователь вошел в систему и была создана учетная запись, они могут создать имя пользователя.

Изменить: Поэтому я не могу понять, как делать запросы на обновление с помощью паспорта, но в моем роутере у меня что-то вроде этого.

app.post('/', function(req, res) {
    if (req.user) {
        AppUser.findOne({ _id: req.user.id }, function (err, user) {
            user.local.username  = req.body.username;
            user.save(function(err) {
                if (err){
                    console.log('Error')
                } else {
                    console.log('Sucess')
                }
            });
        });
    }
});

Единственная проблема - это действие браузера по умолчанию, оно отправляет форму и поддерживает бесконечную перезагрузку страницы. Но он обновляет мою модель mongodb. Мне пришлось добавить дополнение к схеме, и мне пришлось добавить это свойство в логику регистрации паспорта.

Но я мог бы просто добавить эту логику в свой код на стороне клиента и перебросить метод POST в магистраль, и это должно сработать!


person Michael Joseph Aubry    schedule 26.03.2014    source источник
comment
вы имеете в виду, что req.body не содержит нужных вам полей?   -  person jpgc    schedule 27.03.2014
comment
Он должен дать мне то, что мне нужно, но я не могу заставить этот запрос ответить на консоль CLI на стороне сервера, то есть, как только он появится в консоли, у меня будет к нему доступ, а на данный момент у меня нет. В целом я новичок и сбит с толку, но когда я смогу вернуться к обратному вызову successRedirect, мне будет намного лучше.   -  person Michael Joseph Aubry    schedule 27.03.2014
comment
он также требует некоторого запроса mongodb. Я пробовал что-то вроде AppUser.update({'local.email' : '[email protected]'}, { $set: { "local.email": "Warner" } }); что-то статическое, но если обратный вызов возвращает false, запрос не будет выполняться, считая что-либо в function(req, username, done) бесполезным. Очевидно, что-то не так с тем, как я настроил localStrategy для этого конкретного экземпляра.   -  person Michael Joseph Aubry    schedule 27.03.2014
comment
Я изменил свой ответ, вам нужно что-то подобное?   -  person jpgc    schedule 27.03.2014
comment
Если браузер застревает в «бесконечной перезагрузке», это может быть связано с тем, что вы не отправляете никакого ответа. Чтобы решить эту проблему, вы можете попробовать использовать res.send(200) и res.send(403) вместо console.log('Success') и console.log('Error'). Это проблема?   -  person jpgc    schedule 27.03.2014
comment
Спасибо, да, я попробую, имеет смысл.   -  person Michael Joseph Aubry    schedule 27.03.2014
comment
Ничего себе, я не знаю, почему я не подумал об использовании обратного вызова, чтобы дать ответ lol. Вместо этого я использовал перенаправление res.redirect('/');, но это работает феноменально. Я не понимаю, почему это не лучшее решение, есть проверка, если пользователь вошел в систему, и мне все кажется хорошо. Спасибо, что нашли время, чтобы помочь, рада, что мы его получили. Кто-нибудь видит что-то не так, пожалуйста, возразите сейчас! :)   -  person Michael Joseph Aubry    schedule 27.03.2014


Ответы (1)


В подобных случаях вы можете добавить callback array в качестве аргумента для экспресс-маршрута.

Я думаю, вы можете изменить обработчик проверки на что-то вроде:

function(req, username, done) {
    //perform here only the validations you need to let the login pass
    if (validationSuccess) {
        done();
    } else {
    done('an error occured');
    }
}

Итак, предположим, что эта функция успешно проверит учетные данные пользователя, вы можете написать еще один:

function doSomethingAfter(req, res, next) {
    //do anything else you need here
    //e.g.
    SomeModel.create(req.body.username);
    //the response is available here
    res.send('Everything ok');
}

Наконец, вы можете отредактировать свою функцию маршрутизации

app.post('/profile', [passport.authenticate('local-update', {
    failureRedirect : '/signup' // redirect back to the signup page if there is an error
}), doSomethingAfter]);

Таким образом, вы можете выполнить аутентификацию и сделать все, что захотите, после правильной аутентификации запроса. Если вам нужно добавить больше функций, вы должны добавить их в массив и вызвать next() для каждой из них.

Надеюсь, поможет.

person jpgc    schedule 26.03.2014
comment
Спасибо за помощь, но я не уверен, что понимаю, как это включить. Я уверен, что это, наверное, хорошее решение. Посмотрите, что я придумал в OP выше. - person Michael Joseph Aubry; 27.03.2014
comment
Мой ответ - об экспресс-поведении. Когда вы добавляете конечную точку с помощью, скажем, app.post('/foo', handler), обработчик - это функция, которая использует аргументы req, res и next. Аргумент next может использоваться для итерации в массиве функций асинхронно (каждая из которых принимает одни и те же аргументы), вызывая next () внутри функции, чтобы сделать экспресс-вызов следующей. Когда вы используете password.authenticate, этот вызов возвращает функцию, которая принимает аргументы req, res и next, поэтому вы можете передать ее как член массива (вместо моего аргумента handler) и добавить другую функцию в качестве члена. - person jpgc; 27.03.2014
comment
1+ за объяснение, спасибо за это, но это имеет некоторый смысл, но лично мне легче понять то, что я использовал. Я не вижу никаких проблем и чувствую себя чистым. Это хорошее решение, удивительно, как вы можете делать одну вещь несколькими способами. - person Michael Joseph Aubry; 27.03.2014