【发布时间】:2019-11-17 13:33:18
【问题描述】:
我有一个 NodeJS 应用程序,我正在尝试向我的用户个人资料页面添加“新票证”功能。
以下是流程的工作方式 - 1. 用户提交在我的 mongodb 中创建新票的请求 2. 个人资料页面重新加载并在“最近的票证”部分显示新创建的票证。 (我可以轻松检索先前创建的票证)
但是,当我提交发布请求并尝试重新加载个人资料页面时,我会丢失用户数据。 (即未定义用户)。
router.post('/addTicket', [
check('phonenumber', 'user phone number required').not().isEmpty(),
check('requestDevice', 'A device is required').not().isEmpty(),
check('userDescription', 'A brief description is required').not().isEmpty(),
], function(req,res,){
var userDescription = req.body.userDescription;
var requestDevice = req.body.requestDevice;
var phonenumber = req.body.phonenumber;
const result = validationResult(req);
var errors = result.errors;
if (!result.isEmpty()) {
res.render('profile', {
errors: errors,
requestDevice: requestDevice,
userDescription: userDescription,
});
} else {
console.log(phonenumber);
var newTicket = {
id: Math.random().toString(36).substring(2),
requestDevice: requestDevice,
userDescription: userDescription,
openDate: Date.now(),
closeDate: "",
techComment: "",
status : "open",
}
User.updateOne( {phonenumber: phonenumber }, {$push: {"tickets": newTicket } }, false, function(err, doc) {
if(err){
res.send(err);
} else {
console.log('ticket Added...');
res.redirect('/profile', {user:req.session.user}); //I know this req.session.user usage is probably not correct, but I've just been trying everything.
}
});
}
});
还有我的控制台
ReferenceError: D:\users\admin\desktop\from laptop\itspot.v.1.0.0\views\profile.ejs:59
57| <div class="w3-display-container w3-center w3-mobile" style="height: 300px">
58| <div class="w3-display-middle w3-card-2 w3-center" style="margin-top: 25px; width: 35%" >
>> 59| <h4 class="w3-center">Welcome <%= user.name.fname %> !</h4>
60| <p class="w3-center"><img src="../img/avatar.png" class="w3-circle" style="height:106px;width:106px" alt="Avatar"></p>
61| <hr>
62| <p> <i class="fa fa-home fa-fw w3-text-theme"></i> Zip: <%=user.zipcode %> </p>
user is not defined
at eval (eval at compile (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\ejs\lib\ejs.js:633:12), <anonymous>:29:26)
at returnedFn (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\ejs\lib\ejs.js:668:17)
at tryHandleCache (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\ejs\lib\ejs.js:254:36)
at View.exports.renderFile [as engine] (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\ejs\lib\ejs.js:485:10)
at View.render (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\view.js:135:8)
at tryRender (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\application.js:640:10)
at Function.render (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\application.js:592:3)
at ServerResponse.render (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\response.js:1012:7)
at D:\users\admin\desktop\from laptop\itspot.v.1.0.0\routes\users.js:337:11
at Layer.handle [as handle_request] (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\router\layer.js:95:5)
at next (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\router\route.js:137:13)
at Object.<anonymous> (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express-validator\src\middlewares\check.js:23:13)
at Generator.next (<anonymous>)
at fulfilled (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express-validator\src\middlewares\check.js:4:58)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
这是个人资料路线
router.get('/profile', ensureAuthenticated, function(req,res){
res.render('profile');
});
这就是我的 app.js 文件
var routes = require('./routes/index');
var services = require('./routes/services');
var users = require('./routes/users');
var info = require('./routes/info');
var admins = require('./routes/admins');
var app = express();
db.on('error', console.error.bind(console, 'connection error'));
db.once('open', function () {
console.log('db is connected');
});
app.use(helmet());
//view engine
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
//set static folder
app.use(express.static(path.join(__dirname, 'public')));
app.use('/css', express.static(__dirname + '/node_modules/w3-css'));
//body parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
//Express Session Middleware
app.use(session({
secret: 'this is super secret meow',
store: new MongoStore({mongooseConnection: db}),
saveUninitialized: true,
resave: true,
cookie: {
httpOnly: false,
secure: false,
}
}));
//passport middleware
app.use(passport.initialize());
app.use(passport.session());
// Express Validator Middleware
/*app.use(expressValidator({
errorFormatter: function(param, msg, value) {
var namespace = param.split('.'),
root = namespace.shift(),
formParam = root;
while(namespace.length) {
formParam += '[' + namespace.shift() + ']';
}
return {
param : formParam,
msg : msg,
value : value
};
}
})); */
// Connect-Flash Middleware
app.use(flash());
app.use(function (req, res, next) {
res.locals.messages = require('express-messages')(req, res);
next();
});
//Access Globals
app.get('*', function(req, res, next){
res.locals.user = req.user || null;
next();
});
// Define Routes
app.use('/', routes);
app.use('/users', users);
app.use('/services', services);
app.use('/info', info);
app.use('/admins', admins);
app.listen(3000);
console.log('Server started on port 3000');
添加 Mongoose 架构
var mongoose = require('mongoose');
var userSchema = mongoose.Schema({
name: {
fname:{type: String, maxlength: 30, minlength: 1 },
lname: {type: String, maxlength: 30, minlength: 1}
},
role: {type: String, default: "user"},
email: {
type: String,
trim: true,
lowercase: true,
unique: true,
},
phonenumber: { type: String, required: true, validate: /^\d{10}$/, unique: true },
zipcode: String,
password: String,
devices: [],
tickets: [],
creationDate: { type: Date, default: Date.now },
isVerified: {type: Boolean, default: false},
passwordResetToken: String,
PasswordResetExpires: Date,
});
const tokenSchema = mongoose.Schema({
_userId: {type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User'},
token: {type: String, required: true},
createdAt: { type: Date, required: true, default: Date.now, expires: 43200 }
});
const Token = mongoose.model('Token', tokenSchema);
var User = mongoose.model('User', userSchema);
module.exports = {Token, User};
保存到我的数据库中的会话数据
db.sessions.find().pretty()
{
"_id" : "e9bmD-yK2Rsr0fDajeusrtMTCJpUm0pT",
"expires" : ISODate("2019-11-29T19:49:43.182Z"),
"session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"secure\":false,\"httpOnly\":false,\"path\":\"/\"},\"flash\":{},\"passport\":{\"user\":\"5dccd8041ac5ab2eec6f2be7\"}}" //This is the correct user ID, I checked it against the User id in the db.
}
【问题讨论】:
-
在呈现个人资料页面时传递您的
user。res.render('profile');
标签: node.js mongodb express ejs mongojs