mongoose 的重复键错误处理和未处理的承诺拒绝
Posted
技术标签:
【中文标题】mongoose 的重复键错误处理和未处理的承诺拒绝【英文标题】:Duplicate key error handling and unhandled promise rejection with mongoose 【发布时间】:2020-04-03 20:14:05 【问题描述】:我有一个遵循给定架构的用户架构。 根据目的,我让用户注册该网站,然后让他们更新他们的汽车和他们的车号。 车牌号必须是唯一的字符串,而名称可以是任何东西。
这是我的架构 ->
const mongoose = require('mongoose');
require('mongoose-type-email')
const Email = mongoose.Types.Email;
const Schema = mongoose.Schema;
var carNum = new Schema (
plateNum :
type : String,
unique : true,
sparse: true
,
name :
type : String
,
price :
type : Number
);
var userSchema = new Schema(
name :
type : String,
required : true
,
email :
type : Email,
required : true,
unique : true
,
password :
type : String,
required : true
,
car : [carNum]
);
var users = mongoose.model('user',userSchema);
module.exports = users;
这是处理插入的代码。
.post((req,res,next) =>
var plate = req.body.plateNum;
var carname = req.body.carName;
users.findOne('_id': `$userId`)
.then((result) =>
res.statusCode = 200;
res.setHeader('Content-type',"application/json");
res.json(result)
result.car.push(
plateNum : plate,
name : carname,
)
result.save()
)
.catch((err) =>
console.log( "Error : "+ err);
res.send('The name plate number already exists')
);
)
当我尝试发送重复的或已经存在的铭牌时,它会返回未处理的承诺拒绝警告和 mongoDB 错误。
UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error collection: tarp.users index: car.plateNum_1 dup key: car.plateNum: "asd"
at Function.create (C:\Users\Harsh Verma\Documents\VIT\TARP\Project\Tarp Project\node_modules\mongodb\lib\core\error.js:44:12)
at toError (C:\Users\Harsh Verma\Documents\VIT\TARP\Project\Tarp Project\node_modules\mongodb\lib\utils.js:150:22)
at coll.s.topology.update (C:\Users\Harsh Verma\Documents\VIT\TARP\Project\Tarp Project\node_modules\mongodb\lib\operations\common_functions.js:373:39)
at handler (C:\Users\Harsh Verma\Documents\VIT\TARP\Project\Tarp Project\node_modules\mongodb\lib\core\sdam\topology.js:1000:24)
at wireProtocol.(anonymous function) (C:\Users\Harsh Verma\Documents\VIT\TARP\Project\Tarp Project\node_modules\mongodb\lib\core\sdam\server.js:457:5)
at C:\Users\Harsh Verma\Documents\VIT\TARP\Project\Tarp Project\node_modules\mongodb\lib\core\connection\pool.js:408:18
at process._tickCallback (internal/process/next_tick.js:61:11)
(node:14348) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
我确实在那里放置了.catch
,所以那里缺少什么。
我想让用户知道该车牌已经存在。
但是我确实设法让这个工作,但我不知道为什么这不是第一件事。
这是工作的东西
.post((req,res,next) =>
var plate = req.body.plateNum;
var carname = req.body.carName;
users.findOne('_id': `$userId`)
.then((result) =>
res.statusCode = 200;
res.setHeader('Content-type',"application/json");
// res.send(result);
result.car.push(
plateNum : plate,
name : carname,
)
result.save()
.then((saved) =>
// Nothing gets consoled
console.log(saved)
)
.catch((err) =>
console.log( "Error : "+ err);
res.send('The name already exists')
);
)
.catch((err) => res.send('Unable to save : ' + err));
)
【问题讨论】:
感谢任何帮助,如果您需要任何帮助,请告诉我 【参考方案1】:第一个不起作用,因为.save()
不是.findOne()
引发了Duplicate
异常,并且一旦将catch
块添加到save()
它就起作用了。
【讨论】:
那么我在第二个代码中所做的是处理它的正确方法吗? PS:非常感谢您的回答。 是的,因为对数据库的每个操作都需要自己处理错误和异常,例如findOne()
的1 个操作无法捕获来自save()
等另一个操作的异常。 PS-如果它解决了您的问题,您可以将其标记为正确。干杯!以上是关于mongoose 的重复键错误处理和未处理的承诺拒绝的主要内容,如果未能解决你的问题,请参考以下文章
在更新使用 Mongoose 模型检索并作为承诺处理的文档时遇到问题
在处理来自 AngularJS 承诺的错误时,使用 `.catch(function(error)` 和 `function(err Response)` 有啥区别? [重复]