我更新用户配置文件的帖子路由在JS Web应用程序中不起作用。 (猫鼬,节点和护照)
嗨,我当前被卡住了,我的更新路由被打破了,当我单击“更新”按钮时,用户配置文件不会在数据库中更新。我正在使用Passport获取用户ID,但它在我需要的文件的顶部亮了,我不知道为什么。
我以前在一个类似的项目中做到了这一点,而且效果很好,所以我不确定这里发生了什么。
提前致谢。
user.js:
const router = require('express').Router();
const ObjectID = require('mongodb').ObjectID;
const passport = require('passport');
const User = require('../models/user');
router.post('/edit-profile', async (req, res, next) => {
const update = {firstname: req.body.firstname, lastname: req.body.lastname, email: req.body.email, benchpress: req.body.benchpress, squat: req.body.squat, deadlift: req.body.deadlift}
const _id = ObjectID(req.session.passport.user);
const filter = { id: _id };
const updatedDocument = await User.findOneAndUpdate(filter, update, { new: true });
//return res.status(200).send(updatedDocument);
res.render('profile', updatedDocument);
});
edit-profile.ejs:
<div class="main">
<form action="/edit-profile" method="POST" class="ep-form">
<div>
<label for="name">First Name:</label>
<input type="text"name="firstname" id="firstname" value="<%= user.firstname %>" placeholder="First Name">
</div>
<div>
<label for="name">Last Name:</label>
<input type="text"name="lastname" id="lastname" value="<%= user.lastname %>" placeholder="Last Name">
</div>
<div>
<label for="name">Email Address:</label>
<input type="email"name="email" id="email" value="<%= user.email %>" placeholder="Email Address">
</div>
<div>
<label for="name">Bench Press:</label>
<input type="text"name="benchpress" id="benchpress" value="<%= user.benchpress %>" placeholder="Bench Press">
</div>
<div>
<label for="name">Squat:</label>
<input type="text"name="squat" id="squat" value="<%= user.squat %>" placeholder="Squat">
</div>
<div>
<label for="name">Deadlift:</label>
<input type="text"name="deadlift" id="deadlift" value="<%= user.deadlift %>" placeholder="Dead Lift">
</div>
<button type="submit">Update</button>
</form>
<a href="./profile">Back to profile</a>
</div>
护照初始化:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user');
passport.use(
new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
},
async (email, password, done) => {
try {
const user = await User.findOne({ email });
// Username/email does NOT exist
if (!user) {
return done(null, false, {
message: 'Username/email not registered',
});
}
// Email exist and now we need to verify the password
const isMatch = await user.isValidPassword(password);
return isMatch
? done(null, user)
: done(null, false, { message: 'Incorrect password' });
} catch (error) {
done(error);
}
}
)
);
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
Hi I am currently stuck where my update route is broken and when I click the update button, the user profile does not get updated in the database. I am using passport to get the user id but it's greyed out at the top of the file where I am requiring it and I don't know why.
I have done this before in a similar project and it worked fine, so I'm not sure what is going on here.
Thanks in advance.
user.js:
const router = require('express').Router();
const ObjectID = require('mongodb').ObjectID;
const passport = require('passport');
const User = require('../models/user');
router.post('/edit-profile', async (req, res, next) => {
const update = {firstname: req.body.firstname, lastname: req.body.lastname, email: req.body.email, benchpress: req.body.benchpress, squat: req.body.squat, deadlift: req.body.deadlift}
const _id = ObjectID(req.session.passport.user);
const filter = { id: _id };
const updatedDocument = await User.findOneAndUpdate(filter, update, { new: true });
//return res.status(200).send(updatedDocument);
res.render('profile', updatedDocument);
});
edit-profile.ejs:
<div class="main">
<form action="/edit-profile" method="POST" class="ep-form">
<div>
<label for="name">First Name:</label>
<input type="text"name="firstname" id="firstname" value="<%= user.firstname %>" placeholder="First Name">
</div>
<div>
<label for="name">Last Name:</label>
<input type="text"name="lastname" id="lastname" value="<%= user.lastname %>" placeholder="Last Name">
</div>
<div>
<label for="name">Email Address:</label>
<input type="email"name="email" id="email" value="<%= user.email %>" placeholder="Email Address">
</div>
<div>
<label for="name">Bench Press:</label>
<input type="text"name="benchpress" id="benchpress" value="<%= user.benchpress %>" placeholder="Bench Press">
</div>
<div>
<label for="name">Squat:</label>
<input type="text"name="squat" id="squat" value="<%= user.squat %>" placeholder="Squat">
</div>
<div>
<label for="name">Deadlift:</label>
<input type="text"name="deadlift" id="deadlift" value="<%= user.deadlift %>" placeholder="Dead Lift">
</div>
<button type="submit">Update</button>
</form>
<a href="./profile">Back to profile</a>
</div>
passport initialise:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user');
passport.use(
new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
},
async (email, password, done) => {
try {
const user = await User.findOne({ email });
// Username/email does NOT exist
if (!user) {
return done(null, false, {
message: 'Username/email not registered',
});
}
// Email exist and now we need to verify the password
const isMatch = await user.isValidPassword(password);
return isMatch
? done(null, user)
: done(null, false, { message: 'Incorrect password' });
} catch (error) {
done(error);
}
}
)
);
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论