当前,我已经设法将用户信息保存在数据库中。但是,如果Steam数据库中的信息发生更改,我想在他们登录时更新数据库中的用户信息。所以在我的数据库中也是一样。
下面是我的用户架构中的信息示例
const UserSchema = mongoose.Schema({
username:{
type: String,
},
profileURL:{
type: String,
},
profileImageURL:{
type: String,
},
steamId:{
type: String,
}
});
下面是我的app.js的示例。当用户登录时,我检查了数据库中是否存在用户steamId,我想更新用户信息,例如用户名,profileURL,profileImageURL及其SteamID(如果存在),否则我将在数据库中创建一个新用户。我该如何实现?目前,我只是返回完成(空,用户)。
passport.use(new SteamStrategy({
returnURL: 'http://localhost:3000/auth/steam/return',
realm: 'http://localhost:3000/',
apiKey: ''
},
function (identifier, done){
var steamId = identifier.match(/\d+$/)[0];
var profileURL = 'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=' + 'api_Key' + '&steamids=' + steamId;
User.findOne({ steamId: steamId}, function(err, user){
if(user){
return done(null, user);
}
else{
request(profileURL, function (error, response, body){
if (!error && response.statusCode === 200)
{
var data = JSON.parse(body);
var profile = data.response.players[0];
var user = new User();
user.username = profile.personaname;
user.profileURL = profile.profileurl;
user.profileImageURL = profile.avatarfull;
user.steamId = steamId;
user.save(function(err){
done(err, user);
});
}
else
{
done(err, null);
}
});
}
});
}));
答案 0 :(得分:1)
您可以通过启用upsert的更新调用来执行此操作。尝试这样的事情:
request(profileURL, function(err, response, body){
var data = JSON.parse(body);
var user = {
//... construct user object
}
User.findOneAndUpdate({ steamId: steamId }, user, {upsert: true, new: true, setDefaultsOnInsert: true}, function(err, newUser){
if (err) return handleError(err);
done(null, newUser);
});
});