【问题标题】:Aws lambda supports mongoose middleware?Aws lambda 支持 mongoose 中间件?
【发布时间】:2020-02-04 14:57:04
【问题描述】:

AWS lambda 是否支持 mongoose 中间件,我使用.pre() 来检查保存时是否存在数据。

这是我的保存函数调用

res = new cModel();     
res.pre('save', function (next) {
                                    cModel.find({name: company.name}, function (err, docs) {
                                        if (!docs.length){
                                            next();
                                        }else{                
                                            console.log('company name exists: ',company.name);
                                            next(new Error("Company Name exists!"));
                                        }
                                    });
                                }) ;

这是我的更新函数调用

company_model.companySchema.pre('update', function (next) {
                                try {
                                    cModel.find({ name: { $regex: new RegExp(`^${this.getFilter().name}$` , 'i') }}, function (err, docs) {
                                        try {
                                            if (!docs.length) {
                                                next();
                                            } else {
                                                console.log('company name exists: ', this.getFilter().name);
                                                next(new Error("Company Name exists!"));
                                            }
                                        } catch (e) {
                                            console.error('error in cModel.find: ' + e.message);
                                        }
                                    });
                                } catch (e) {
                                    console.error('error in pre save : ' + e.message)
                                }
                            });

【问题讨论】:

  • 我认为没有理由不这样做,因为您正确等待所有异步方法完成执行。为什么你会期望它不会呢?你有一些代码来展示这个问题吗?
  • @caffeinated.tech 更新了函数调用

标签: mongodb amazon-web-services mongoose aws-lambda


【解决方案1】:

e在pre('save',... 挂钩内,在this 下可以找到对当前文档的引用。在这里,我在您的示例中将company 替换为this

const schema = new mongoose.Schema({})
schema.pre('save', function (next) {
  cModel.find({name: this.name}, function (err, docs) {
    if (!docs.length){
      next();
    } else {                                 
      console.log('company name exists: ', this.name);
      next(new Error("Company Name exists!"));
    }
  });
});
const cModel = mongoose.model("cmodel", schema)

此错误与 lambda 无关,只是 lambda 中的执行环境似乎正在吞噬 async 方法中的错误。要查看抛出的错误,您可以将回调的内容包装在 try {...} catch (e) {...} 块中,并将错误记录在 catch 块中:

const schema = new mongoose.Schema({})    
schema.pre('save', function (next) {
  try {
    cModel.find({name: this.name}, function (err, docs) {
      try {
        if (!docs.length){
          next();
        } else {                                 
          console.log('company name exists: ', this.name);
          next(new Error("Company Name exists!"));
        }
      } catch (e) {
        console.error('error in cModel.find: ' + e.message)
      }
    });
  } catch (e) {
    console.error('error in pre save : ' + e.message)
  }
});
const cModel = mongoose.model("cmodel", schema)

更新

使用.pre('update'... 将使this 引用查询,而不是文档,因为文档永远不会加载。您可以使用getFilter()getUpdate() 访问部分查询。

这是一个在进行更新之前检查公司是否存在的示例:

const schema = new mongoose.Schema({})
schema.pre('update', function (next) {
  let newName = this.getUpdate().name;
  cModel.find({name: newName }, function (err, docs) {
    if (!docs.length){
      next();
    } else {                                 
      console.log('company name exists: ', newName);
      next(new Error("Company Name exists!"));
    }
  });
});
const cModel = mongoose.model("cmodel", schema)

【讨论】:

  • @Farhan 感谢您指出这一点,我没有检查我写的内容。 pre 钩子需要在架构上定义,而不是在文档上。
  • @Farhan 在预update 挂钩中您没有对文档的引用,因为它没有加载。更新发生在数据库中,它不会首先将文档获取到您的代码中然后更新它。 this 是一个 pre('update',...) 钩子将是对查询的引用,因此您可以使用 this.getFilter().name 在钩子中获取公司名称。其余的将保持不变。
  • 那没有用,用update function更新了问题你能验证吗?如果可能的话,如果它不正确,你能写吗?
  • 您需要说明它是如何不起作用的 - 是否有错误?并且请包括您正在运行以测试它的查询,以及您应该做什么的意图。如果您想检查将要更新的名称,而不是原来的名称,也许应该是 this.getUpdate().name
  • 所以这是一种情况,当我注意到进行任何更改并单击保存时更新时,它说名称存在。它检查没有更新的东西,有什么解决方案吗?
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多