【问题标题】:MongooseError [OverwriteModelError]: Cannot overwrite `Team` model once compiledMongooseError [OverwriteModelError]:编译后无法覆盖`Team`模型
【发布时间】:2020-03-06 12:59:18
【问题描述】:

我正在从 react 客户端调用 node.js express api。

当我从客户端拨打电话时,这是我的请求:

const response = await axios({
            method: 'post',
            url: 'http://localhost:3000/api/users/forgotPassword',
            data: {email: email},
            headers: {
              'X-Requested-With': 'XMLHttpRequest',
            }
          }
        );

这是 express 中的端点:

adminUserRoutes.post('/forgotPassword', (req, res) => {
  console.log('it connected')
  if (req.body.email === '') {
    res.status(400).send('email required');
  }
  console.log(req.body.email)
  console.log(req.body)
  User.findOne({email: req.body.email}, (err, user) => {
    console.log('and here')
    if(user){
      const token = crypto.randomBytes(20).toString('hex');
      console.log('use',user)
      user.resetPasswordToken = token
      user.resetPasswordExpires = Date.now() + 360000
      user.name = user.name
      user.email = user.email
      user.password = user.password
      user.admin = user.admin

      // console.log(user)

      user.save()


      const transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
          user: `email`,
          pass: `password`,
        },
      });

      const mailOptions = {
        from: 'devinjjordan@gmail.com',
        to: `${user.email}`,
        subject: 'Link To Reset Password',
        text:
          'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n'
          + 'Please click on the following link, or paste this into your browser to complete the process within one hour of receiving it:\n\n'
          + `http://localhost:3000/#/newpassword/${token}\n\n`
          + 'If you did not request this, please ignore this email and your password will remain unchanged.\n',
      };

      console.log('sending mail');

      transporter.sendMail(mailOptions, (err, response) => {
        if (err) {
          console.error('there was an error: ', err);
          // res.status(200).json('there was an error: ', err);
        } else {
          console.log('here is the res: ', response);

          res.set({

              "Access-Control-Allow-Origin": "*", // Required for CORS support to work
              "Access-Control-Allow-Credentials": true // Required for cookies, authorization headers with HTTPS

          })

          res.status(200).json('recovery email sent');
        }
      });
    } else {
      console.error('email not in database');
      res.status(403).send('email not in db');
    }
  })
});

这种情况的奇怪之处在于,当我从邮递员向同一个端点发出请求时,我收到了预期的响应。

但是,当我从客户端发出请求时,我收到此错误:

MongooseError [OverwriteModelError]: Cannot overwrite `Team` model once compiled.
    at new OverwriteModelError (/Users/lukeschoenberger/Documents/Programming/news-arg/backend/node_modules/mongoose/lib/error/overwriteModel.js:20:11)
    at Mongoose.model (/Users/lukeschoenberger/Documents/Programming/news-arg/backend/node_modules/mongoose/lib/index.js:517:13)

我正在使用无服务器 labdma,并且正在离线运行 sls,开始在端口 3000 上打开。

非常奇怪的是,有问题的 api 中甚至没有提到“团队”模型。

编辑: 这是团队模块:

const mongoose = require('mongoose')
const Schema = mongoose.Schema

let Team = new Schema({
    team_name: {
        type: String
    },
    city_or_state: {
        type: String
    },
    league: {
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: 'League'
    },
    primary_color: {
        type: String
    }
}, { timestamps: true })

module.exports = mongoose.model('Team', Team)

【问题讨论】:

  • 您可以在问题中添加团队模型代码吗?
  • 另外 user.save() 返回一个promise,所以你需要使用 then 阻塞,或者简单地等待 user.save() 并将 async 添加到 async (req, res)
  • @SuleymanSah 我更新了原始帖子以显示团队模块
  • 你知道你在问题中写下了你的电子邮件和密码吗?
  • @CapiEtheriel 我没有。感谢您指出这一点。

标签: node.js reactjs express mongoose aws-serverless


【解决方案1】:

这原来是 aws-serverless 的一个问题。使用此标志运行 aws-serverless 可解决问题:--skipCacheInvalidation -c。更长的帖子:https://github.com/dherault/serverless-offline/issues/258

【讨论】:

    【解决方案2】:

    几周前我也遇到了同样的错误。在尝试了几件事后,我得出了一个简单的解决方法:

    尝试以这种方式导出人物模型 -

    module.exports.teamModel= mongoose.model('Team', Team);

    而不是-module.exports = mongoose.model('Team', Team)

    希望这会有所帮助!

    如果您仍然收到错误,请检查您正在导出此模型的模块中的路径。

    【讨论】:

      【解决方案3】:

      您在运行时多次编译模型。在注册之前检查您的模型是否已经注册:

      module.exports = mongoose.models.Team || mongoose.model('Team', Team)
      

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 2017-10-04
        • 2022-08-21
        • 2020-11-13
        • 2019-02-28
        • 2021-05-18
        • 2019-08-31
        • 2019-01-13
        • 2013-10-03
        相关资源
        最近更新 更多