node.js - 无法捕获 Mongoose 模型保存的错误

标签 node.js validation mongoose

我有一个简单的用户架构:

/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;

以及一个带有能够创建用户的表单的索引页。如果保存无法正常工作,我想向用户显示一条闪存消息。我知道这样做的前提是在 get 路由中为消息创建一个位置,如果消息存在,则渲染一个包含该消息的 dom 元素。不幸的是,我所能管理的就是使服务器崩溃并接收:

错误消息

events.js:160
      throw er; // Unhandled 'error' event
      ^
BulkWriteError: E11000 duplicate key error collection: test.users index: email_1 dup key: { : "test@gmail.com" }
    at /home/bob/sites/mysite.ca/projects/login/node_modules/mongodb/lib/bulk/unordered.js:528:15
    at handleCallback (/home/bob/sites/mysite.ca/projects/login/node_modules/mongodb/lib/utils.js:128:55)
    at resultHandler (/home/bob/sites/mysite.ca/projects/login/node_modules/mongodb/lib/bulk/unordered.js:454:5)
    at /home/bob/sites/mysite.ca/projects/login/node_modules/mongodb-core/lib/connection/pool.js:541:18
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)

/routes/index.js

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
  console.log('index.js db connected!');
});

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(error) {
    if (error) console.log(error);
    console.log('User ' + user.username + ' successfully created!');
  });
});

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render(
    'index',
    {
        title: 'Express'
    }
  );
});

module.exports = router;

如何捕获此错误并处理它而不是导致 Node 服务器崩溃?

最佳答案

我认为你的代码是正确的,你只需要在 app.js 中创建 mongoose 连接一次,默认情况下 mongoose 使用 5 个并发连接的池,不需要创建连接在每个路由器中:

app.js

...
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
...

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(req.body);
    user.save(function(err, user) {
        if (err) return res.json(err);
        res.send('User ' + user.username + ' successfully created!');
    });
});

关于node.js - 无法捕获 Mongoose 模型保存的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48159862/

相关文章:

node.js - cookie session express 包中带有 req.session 的空对象

javascript - 脚本标签内的 Jade 条件语句

asp.net - ASP.NET 验证规则可以属于多个组吗?

validation - grails字段插件: “blank”错误的处理方式与其他方式不同吗?

node.js - Mongoose 如何编写带if条件的查询?

javascript - 从 html 访问 Nodejs 服务器

javascript - 无法在React中输入InputType 'text'

python - Django:根据 object.owner 检查请求用户

node.js - 带有自己的 ObjectId 的 Mongoose 自引用抛出 : cast to ObjectId failed

node.js - 根据属性过滤 mongodb 文档并链接结果