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 处理承诺的问题

使用 Promises 处理 Mongoose 错误

处理类构造函数中的承诺错误[重复]

未处理的承诺拒绝:错误:URL 格式错误,无法解析

在更新使用 Mongoose 模型检索并作为承诺处理的文档时遇到问题

在处理来自 AngularJS 承诺的错误时,使用 `.catch(function(error)` 和 `function(err Response)` 有啥区别? [重复]