KeystoneJS显示unqiue索引失败的错误

时间:2015-12-07 00:49:14

标签: keystonejs

我有一个跟踪重定向的模型:

var Redirect = new keystone.List('Redirect', {
});

Redirect.add({
    from: { type: String, required: true, initial: true, unique: true },
    to: { type: String, required: true, initial: true },
    status: { type: Types.Select, options: [{value: 302, label: 'Temporary'},{value: 301, label: 'Permanent'}], default: 302, numeric: true, initial: true }
});

独特的约束有效,我可以创建新的模型,只要它没有一个独特的'来自'但当我创建一个非独特的' ;从'我在服务器控制台中收到错误,但前端什么也没做。

  

将更改保存到重定向5664d5860d7c730f09880de1时出错:{   [MongoError:insertDocument ::由:: 11000 E11000重复键引起   错误索引:keystone.redirects。$ from_1 dup key:{:" / herp" }]
  名称:' MongoError',代码:11000,错误:' insertDocument ::由   :: 11000 E11000重复键错误索引:keystone.redirects。$ from_1   dup key:{:" / herp" }' }

我是否需要另外设置才能让错误显示在前端,以便用户知道出了什么问题?

1 个答案:

答案 0 :(得分:0)

您必须在服务器逻辑中捕获该错误,并向访问者显示更友好的Flash消息。至少数据库错误消息描述了问题duplicate key error ...

exports.flashMessages = function(req, res, next) {
  var flashMessages = {
    error: req.flash('error')
  };
  res.locals.messages = _.any(flashMessages,
                              function(msgs) { return msgs.length }) ? flashMessages
                                                                     : false;
  next();  
};

请参阅Common Route Middleware

并自定义消息,确保传递的对象包含模板的相应字段

您可以通过添加req.flash

在服务器逻辑中提供Flash消息
req.flash(
  'success',
  'Your job has been submitted. Allow 30 days for approval.'
);

请参阅https://github.com/r3dm/shpesfba.org/blob/b83d9e6a3859a83f4b4738e7a13ead08ce611bd3/routes/views/jobForm.js#L44

要在adminUI中显示flash错误,请创建一个错误对象并将其传回next回调,如此

Redirect.schema.pre('save', function(next) {
  if (saveFailure) {
    var err = new Error('MongoDB is barfing on this');
    next(err);
  }
}

困难的部分是使用mongoose prepost生命周期钩子来制作你的逻辑以捕获mongodb错误。请做一些实验。

请参阅https://github.com/r3dm/shpesfba.org/blob/b83d9e6a3859a83f4b4738e7a13ead08ce611bd3/models/Event.js#L76