【问题标题】:Display Flash Error Messages to User After Mongoose Model SaveMongoose 模型保存后向用户显示 Flash 错误消息
【发布时间】:2018-06-18 02:12:21
【问题描述】:

我有一个页面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 文件中有一些条件。我想要做的是,如果发生错误,我想根据错误类型(即用户名已被使用,或密码太短)将消息分配给变量并将该变量传递给我的哈巴狗视图。然后视图将呈现消息如果设置了正确的变量。有人可以帮帮我吗?我主要是在努力解决我还必须呈现用户列表的事实,如果我尝试在错误捕获部分 post 节点抱怨标头已被设置中找到用户,即如果我有我的 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.

【问题讨论】:

    标签: node.js express mongoose pug router


    【解决方案1】:
     username: { type: String, required: true, unique: true },
    

    这是因为独一无二的真实。

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

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

    一样返回
     if (err) return next(err)
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-12
      • 2016-02-15
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多