【问题标题】:ParallelSaveError: Can't save() the same doc multiple times in parallel. Document:ParallelSaveError:无法并行保存()同一个文档。文档:
【发布时间】:2021-03-04 11:25:12
【问题描述】:

嗨,我是 mern 堆栈的新手,我在 save() 函数上遇到以下错误:

ParallelSaveError: Can't save() the same doc multiple times in parallel. Document: 5fb8879151188d024cf0f6ec\n    at model.Model.save (c:\\Users\\livia\\OneDrive\\Documents\\mern-ecommerce\\node_modules\\mongoose\\lib\\model.js:465:23)\n    at Object.exports.signup (c:\\Users\\livia\\OneDrive\\Documents\\mern-ecommerce\\server\\services\\merchant\\accountService.js:59:22)\n    at exports.accountSignupServlet (c:\\Users\\livia\\OneDrive\\Documents\\mern-ecommerce\\server\\servlet\\merchant\\accountSignupServlet.js:7:33)\n    at Layer.handle [as handle_request] (c:\\Users\\livia\\OneDrive\\Documents\\mern-ecommerce\\node_modules\\express\\lib\\router\\layer.js:95:5)\n    at next (c:\\Users\\livia\\OneDrive\\Documents\\mern-ecommerce\\node_modules\\express\\lib\\router\\route.js:137:13)\n    at Route.dispatch (c:\\Users\\livia\\OneDrive\\Documents\\mern-ecommerce\\node_modules\\express\\lib\\router\\route.js:112:3)\n    at Layer.handle [as handle_request] (c:\\Users\\livia\\OneDrive\\Documents\\mern-ecommerce\\node_modules\\express\\lib\\router\\layer.js:95:5… …

这是我的 accountService.js 文件

    const mailgun = require('../mailgun');
    const Merchant = require('../../models/merchant');
    const validator = require('validator');
    const { httpErrorCode } = require('../../../constant');
    const { json } = require('express');
    
    exports.signup = (name, business, email, phoneNumber, brand) => {
        try{ 
          let json = {
            result : {},
            error : false,
            message : '',
            code : ''
          };
    
        if (validator.isEmpty(validator.trim(name))) {
            json.error = true;
            json.message = 'You must enter your name.';
            json.code = httpErrorCode.USER_ERROR;
            return json;
          }
        
          if (!validator.isEmail(email)) {
            json.error = true;
            json.message = 'You must enter a valid email address.';
            json.code = httpErrorCode.USER_ERROR;
            return json;
          }
    
          if (!validator.isMobilePhone(phoneNumber)) {
            json.error = true;
            json.message = 'You must enter a valid phone number.';
            json.code = httpErrorCode.USER_ERROR;
            return json;
          }
          
          if (validator.isEmpty(brand)) {
            json.error = true;
            json.message = 'You must enter a brand name.';
            json.code = httpErrorCode.USER_ERROR;
            return json;
          }
    
          if (!validator.isLength(business, {min : 10})) {
            json.error = true;
            json.message = 'Business description must be at least 10 characters.';
            json.code = httpErrorCode.USER_ERROR;
            return json;
          }
        
          const merchant = new Merchant({
            name,
            business,
            email,
            phoneNumber,
            brand
          });
        
          merchant.save((e, data) => { // <--- this is where i encountered error 
            if (e) {
                json.error = true;
                json.message = e.message;
                json.code = httpErrorCode.SERVER_ERROR;
                return json;
            }
        
            mailgun.sendEmail(email, 'merchant-application');
            
            json.result = data;
            json.error = false;
            json.message = `We received your request! we will reach you on your phone number ${phoneNumber}!`;
            json.code = httpErrorCode.SUCCESS;
            return json;
          });
        }catch(e){
            json.error = true;
            json.message = e.message;
            json.code = httpErrorCode.SERVER_ERROR;
            return json;
        }
// <-- cursor jumped directly here error is not caught in catch block
    }

这是我的模型文件merchant.js

const Mongoose = require('mongoose');
const { Schema } = Mongoose;

// Merchant Schema
const MerchantSchema = new Schema({
  name: {
    type: String,
    trim: true
  },
  email: {
    type: String
  },
  phoneNumber: {
    type: String
  },
  brand: {
    type: String
  },
  business: {
    type: String,
    trim: true
  },
  isApproved: {
    type: Boolean,
    default: false
  },
  status: {
    type: String,
    default: 'Waiting Approval',
    enum: ['Active', 'Not Active', 'Waiting Approval', 'Rejected']
  },
  updated: Date,
  created: {
    type: Date,
    default: Date.now
  }
});

module.exports = Mongoose.model('Merchant', MerchantSchema);

正如您在代码中看到的那样,我在 accountService.js 中一次保存我的文档,但错误显示我正在多次保存我的文档。

并且错误未在 try catch 块中捕获,例如

function saveMerchant(){
try{
  merchant.save();      // <-- this is where error encountered
}catch(e){
  console.log(e.message);
}
// <-- cursor directly jumped here
}

为什么在 catch 块中没有捕获到错误?

我不明白我做错了什么。我正在使用 mongoose 5.5.11 版,任何帮助都将不胜感激。谢谢

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    使用等待或回调,而不是两者。

    【讨论】:

    • 我试过你说的@D。 SM,但它没有帮助。程序的行为仍然相同
    猜你喜欢
    • 2020-04-11
    • 2021-09-16
    • 2021-06-05
    • 2020-04-05
    • 2020-01-08
    • 2020-01-09
    • 2011-05-04
    • 2020-01-03
    • 2019-03-19
    相关资源
    最近更新 更多