【问题标题】:ExpressJS/Mongodb POST request and losing user dataExpressJS/Mongodb POST 请求和丢失用户数据
【发布时间】: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.
}

【问题讨论】:

  • 在呈现个人资料页面时传递您的userres.render('profile');

标签: node.js mongodb express ejs mongojs


【解决方案1】:

尝试重定向到/profile 路由而不是渲染视图

db.users.update( {phonenumber: phonenumber }, {$set: {"tickets":  [newTicket]  } }, false, function(err, doc) {
                if(err){
                        res.send(err);
                    } else {
                        console.log('ticket Added...');
                        res.redirect('/profile'); // Change render to redirect

                    }
            });

【讨论】:

  • 试一试,但没有运气......不过我很感激你的回应。我仍在尝试找到一种发送发布请求并重新加载页面以显示更新的方法。 (即添加一张票,然后显示新添加的票)
【解决方案2】:
User.findOneAndUpdate( {phonenumber: phonenumber }, {$push: {"tickets": newTicket } }, {new: true}, function(err, doc) { if(err){ res.send(err); } else { console.log('ticket Added...', doc, 'this is updated data'); res.redirect('/profile', {user: doc}); 

【讨论】:

  • 感谢您的回复,但这并不能解决问题。
  • @Mdurocher 您是否遇到与以前相同的错误?是的,我看到您在 ejs 文件中定义了 user.username,但是您的用户对象没有任何名为 username 的字段,因此其数据在用户对象中不可用
  • 我更新了代码并展示了应用程序的更多部分,不确定它是否有助于隔离问题,我感到非常沮丧,而且我知道这将是一件简单的事情俯瞰。
  • 我看到你用过猫鼬,所以你能分享一下用户模式,并记录 req.session 看看会话是否有任何数据,因为我看不到任何数据被分配在您的代码中进行会话。您所做的一切都是正确的,只是没有正确使用变量,因此只需使用 user.updateone 的 session 和 doc => 的控制台数据更新代码,我们就可以找到解决方案。
  • 好的,我添加了保存到我的数据库的架构和会话数据。
猜你喜欢
  • 1970-01-01
  • 2020-09-23
  • 2016-03-21
  • 2015-08-20
  • 1970-01-01
  • 2016-06-30
  • 2014-03-03
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多