2014-03-26 71 views
1

我遍佈所有的文檔,但我似乎無法找到更新憑據的方法。更新或添加passport.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中找到模型。我試着首先在控制檯中看到req,這樣我可以看到如何找到模型,但沒有任何顯示。

顯然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模型。我必須插入Schema,並且必須在護照註冊邏輯中添加該屬性。

但是我可以將這個邏輯添加到我的客戶端代碼中,並將POST方法放入主幹中,並且應該可以工作!

+0

你的意思是'req.body'不包含你需要的字段? – jpgc

+0

它應該給我我需要的東西,但是我無法得到響應服務器端CLI控制檯的請求,也就是說,一旦它出現在控制檯中,我就可以訪問它,但現在我不知道。總的來說,我很新,感到困惑,但是當我能夠回到成功的Red​​irect時,我會變得更好。 –

+0

它也需要一些mongodb查詢我嘗試了'AppUser.update({'local.email':'[email protected]'}, {$ set:{「local.email」:「Warner」} } );'靜態的東西,但如果回調返回false,查詢不會執行認爲'function(req,username,done)'中的任何東西'無用。我爲這個特定的實例設置localStrategy顯然有些問題。 –

回答

1

在這種情況下,您可以添加一個callback array作爲Express路徑的參數。

我想你可以改變你的驗證處理程序是這樣的:

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()

希望它有幫助。

+0

感謝您的幫助,但我不確定我是否理解如何合併。我相信這可能是一個很好的解決方案。看看我在上面的OP中想到了什麼。 –

+1

我的答案是關於表達'行爲。當你使用'app.post('/ foo',handler)'添加一個端點時,handler是一個使用'req','res'和'next'參數的函數。 'next'參數可以用來異步地在一個函數數組中迭代(每個函數採用相同的參數),通過調用函數內的next()來進行下一個函數的快速調用。當你使用passport.authenticate時,該調用返回一個帶'req','res'和'next'參數的函數,所以你可以將它作爲一個數組的成員(而不是我的'handler'參數)傳遞,並添加另一個作爲成員的功能。 – jpgc

+0

1+爲解釋,謝謝你,但它是有道理的,但對我個人而言,我去與我更容易理解。我沒有看到任何問題,感覺乾淨。這是一個很好的解決方案,令人驚訝的是你如何能夠以多種方式做一件事 –