express, passport, mongoose, express-session is in use.
User.findOne({'_id': req.user._id}, function(err, user){/user document search
if(err){console.log('findOneError')}else{
user.profImgHref = /*omitted* /; // Modify DB
req.session.passport.user.profImgHref = user.profImgHref; // update session
user.save(); // Modify DB
req.logIn(user, function(err){
if(err)return err;
});
}
});
The user has been using the mongoose model and is trying to update the user's profileImgHref. In addition to modifying the DB, the session value should also be modified, but passport is linked, and here (https://github.They called com/jaredhanson/passport/issues/208) req.login and told me I had to deserialize it again So at the end, req.I put in login, but there is still no change. Is there a part that I forgot? The session value is res.locals.userSession = req in app.js.I'm calling it up with user;
Additional explanation of questions
Here's the logic of my code.
However, as I checked with Robomongo, the session value has not changed at all. Session req. through passport.I think it's right to send it in user form (req.user was not effective even if I put it directly at the router end.) However, there is only a change in DB value, so if I log in directly, the passport changes in the session during the session reconstruction stage.
Reattach the code on the router side in detail.
router.post('/profImg', function(req, res, next){
var form = new multiparty.Form({//multiparty module in use)
maxFilesSize: 512 * 1024
});
form.on('error', function(message) {
res.status = 413;
res.send (413, 'Problems occurred. Please try again or contact your administrator.');
res.end();
});
form.on('part', function(part) {
if(part.fileName){ // recheck file type, file size
var type = part.headers['content-type'];
var size = part.byteCount - part.byteOffset;
if(type != 'image/jpeg' && type != 'image/png' && type != 'application/gif' || size == 0) {
this.emit('error');
}
}
});
form.on('close', function(){
res.json();
});
form.parse(req, function(err, fields, files){
function instFile (filesArg){
// Take files.profImg[0] as a factor
var data = fs.readFileSync(filesArg.path),
fName = filesArg.path.split('/').pop(),
userID = req.user._id.valueOf(),
forKey = 'profile/'+userID+'/'+fName,
params = {
Bucket: 'bucketName',
ACL: 'public-read',
Key: forKey,
Body: data
}
If (filesArg.size==0){ // delete temporary file if size is 0
fs.unlinkSync(filesArg.path);
}else{
if(req.user.profImgHref){
var params2 = {
Bucket: 'bucketName',
Key: 'profile/'+userID
}
s3.deleteObject(params2, function(err, data){
if(data){
console.log ("File Deletion Successful"); // situations where it cannot be deleted. The cause is unknown
}else{
console.log(err);
}
});
}
s3.putObject(params, function (err, data) {
if(err){
console.log(err, err.stack);
console.log ('putObjectError');
}else{
User.findOne({'_id': req.user._id}, function(err, user){
if(err){console.log('findOneError')}else{
// Modify Image Url
user.profImgHref = 'https://bbucketName.s3.amazonaws.com/'+forKey;
req.user.profImgHref = user.profImgHref;
user.save();
console.log(user);
req.logIn(user, function(err){
if(err)return err;
});
console.log(req.session.passport.user.profImgHref);
}
});
}
});
}
}
instFile(files.profImg[0]);
});
});
Resave is set to false in the session setting.
Req to reflect in store.session.You can sing "Save" yourself or "resave" to "true".
https://github.com/expressjs/session#sessionsave
If not SPA, req.I don't think you need to log in.
Additional answers
If you look at the difference between the code you uploaded and my code, req.session.I think you're using passport.user. For me, req.I sent the user to the view and used it.
https://github.com/tutsplus/passport-mongo I tested it using the code in .
Below is the first answer
https://github.com/jaredhanson/passport/issues/208 If you look at the bottom of the section, there is a story that there is no need to update the session separately because the passport updates the session with the id (a comment from someone named samhuntsocial) Hello I tested it with the login maintained.
router.get('/home', isAuthenticated, function(req, res){
User.findOne({'_id': req.user._id}, function(err, user){
if(err){console.log('findOneError')}else{
user.firstName = user.firstName+"#";
user.save();
}
});
res.render('home', { user: req.user });
});
When I tried it with this, # was added to the firstName every time I reloaded the page. But if you're going to do it with a single page app without a page reload, I'll have to find another way, but if not, I think you just need to reload the page.
It's not Jade, but I'm using handlebars
This is HTml.
<divid="preview"><imgsrc="{{#ifuserSession.profImgHref}{{userSession.profImgHref}}{{/if}}" alt=""></div>
I extracted the code related to the session from app.js.
var express = require ('express'),
path = require('path'),
logger = require('morgan'),
cookieParser = require('cookie-parser'),
bodyParser = require('body-parser'),
exphbs = require('express-handlebars'),
routes = require('./routes/index'),
newclass = require('./routes/newClassSubmit'),
mypage = require('./routes/mypage'),
mongoose = require('mongoose'),
csurf = require('csurf'),
filter = require('content-filter');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
var app = express();
app.use(session({
cooke: {
maxAge: 30 * 24 * 60 * 60 * 1000,
expires: 7200000,
httpOnly: true
},
resave: false,
saveUninitialized: false,
secret: '~~~',
store: new MongoStore({
mongooseConnection: mongoose.connection
})
}));
// // passport
var passport = require('./config/passport');
app.use(passport.initialize());
app.use(passport.session());
// Session forwarding
app.use(function(req, res, next){
res.locals.userSession = req.user;
next();
});
// // router Setup
app.use('/', routes);
app.use('/newClassSubmit', newclass);
app.use('/mypage', mypage);
config/passport.js
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
User = require('../models/User.js'),
bcrypt = require('bcrypt');
passport.serializeUser(function(user, done){
done(null, user);
});
passport.deserializeUser(function(user, done){
done(null, user);
});
passport.use('local-login', //LocalStrategy Setup
new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function(req, email, password, done){
User.findOne({'email':email}, function(err,user){ // Search for user by entered email
if(err) return done(err); // error message output
if(!user){
return done (null, false, {msg: 'NoID'}); // return NoID if the user is not present
}
If(!user.authenticate(password)) { // Mongoose method of matching passwords
return done (null, false, {msg: 'WrPW'}); // return WrPW if password is different
}
return done (null, user);// return user DB if there is no problem
});
})
);
module.exports = passport;
models/User.js
var mongoose = require ("mongoose"),
bcrypt = require('bcrypt');
// Set membership schema
var userSchema = new mongoose.Schema({
//omitted
profileImgHref: String // profile image address
});
userSchema.pre('save', function(next){ // Password encryption before modifying user information
var user = this;
If(!user.isModified('password'){ // If there is no change in password, next()
return next();
}else{
user.password = bcrypt.hashSync(user.password, bcrypt.genSaltSync())); // Encrypt if there is any change
return next();
}
});
//password verification method
userSchema.methods.authenticate = function (password) {
var user = this;
return bcrypt.compareSync(password,user.password);
}
var User = mongoose.model('user',userSchema);
module.exports = User;
633 Uncaught (inpromise) Error on Electron: An object could not be cloned
577 Who developed the "avformat-59.dll" that comes with FFmpeg?
575 rails db:create error: Could not find mysql2-0.5.4 in any of the sources
926 When building Fast API+Uvicorn environment with PyInstaller, console=False results in an error
© 2024 OneMinuteCode. All rights reserved.