在Mongoose模型保存后向用户显示Flash错误消息

时间:2018-01-09 04:33:03

标签: node.js express mongoose pug router

我有一个页面index.js,其中包含一个用于添加用户的表单,旁边是数据库中的用户列表。

/routes/index.js

var express = require('express');
var router = express.Router();
var User = require('../schemas/user');

router.post('/create', function(req, res, next) {
  var user = new User({
    username: req.body.username,
    email: req.body.email,
    password: req.body.password
  });
  user.save(function(err) {
    if (err) {
      console.log('user save error ' + err.errmsg);
      return res.json(err.errmsg);
    }
    res.redirect('/');
  });
});

/* GET home page. */
router.get('/', function(req, res, next) {
  User.find(function (err, users) {
    if (err) {
      console.log('get error ' + err);
      //return res.sendStatus(500);
    }
    res.render(
      'index',
      {
        userList : users
      }
    );
  });
});

module.exports = router;

/schemas/user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
  username: { type: String, required: true, unique: true },
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  group: String,
  created_at: Date,
  updated_at: Date
});

var User = mongoose.model(
  'User',
  userSchema
);

module.exports = User;

以下是我的观点:

/views/index.pug

extends layout

block content
  h1= title
  p Welcome to #{title}

  .container
    .row
      .col-sm
        h1 Create User
        form(
          method='POST'
          action='/create'
        )
          .form-group
            label(for='username') Username:
            input#username.form-control(
              type='text',
              placeholder='Enter username...',
              name='username'
            )
            if usernameError
              p.error= usernameError
          .form-group
            label(for='password') Password:
            input#password.form-control(
              type='password',
              placeholder='Enter password...',
              name='password'
            )
            if passwordError
              p.error= passwordError
          .form-group
            label(for='email') Email:
            input#email.form-control(
              type='email',
              placeholder='Enter email...',
              name='email'
            )
            if emailError
              p.error= emailError
          button.btn.btn-primary(
            type='submit',
          ) Submit
      .col-sm
        h2 User List
        ul
          each user in userList
            li= user.username

如您所见,我的index.pug文件中有一些条件。我想要做的是如果发生错误我想根据错误类型(即已经使用的用户名或密码太短)将消息分配给变量,并将该变量传递给我的pug视图。然后,视图将呈现消息,如果设置了正确的变量。有人可以帮帮我吗?我大部分都在努力解决这个事实,即我还必须渲染用户列表,如果我试图找到错误捕获部分帖子节点中的用户抱怨已经设置的头文件,即如果我有我的router.post函数像这样:

router.post('/create', function(req, res, next) {
  var user = new User({
    username: req.body.username,
    email: req.body.email,
    password: req.body.password
  });
  user.save(function(err) {
    if (err) {
      console.log('user save error ' + err.errmsg);
      User.find(function (err2, users) {
        if (err2) {
          console.log('get error ' + err2);
          //return res.sendStatus(500);
        }
        res.render(
          'index',
          {
            userList : users,
            usernameError: err.errmsg
          }
        );
      });
    }
    res.redirect('/');
  });
});

然后我希望在我的视图中看到填充的usernameError消息,但是我从节点服务器收到错误:

user save error E11000 duplicate key error collection: test.users index: username_1 dup key: { : "John" }
POST /create 302 71.995 ms - 46
Error: Can't set headers after they are sent.

1 个答案:

答案 0 :(得分:2)

 username: { type: String, required: true, unique: true },

这是因为唯一的真实。

  

错误:发送后无法设置标头。

错误,因为您没有返回错误。每当发生错误时,只需返回

 if (err) return next(err)

前提是您正在使用快速集中式错误处理程序 检查你的app.js.的最后几行。下一个(错误)的所有错误都在这里

app.use(function(err, req, res, next) {
    console.error( err);
..............
});