【问题标题】:Mongoose findOneAndUpdate doesn't find (or update) in NodeMongoose findOneAndUpdate 在 Node 中找不到(或更新)
【发布时间】:2020-08-19 12:55:22
【问题描述】:

我正在尝试使用 Mongoose 将用户输入(url)添加到数据库中,但还要检查添加的数据是否已经存在。相反,它似乎每次都在创建一个新模型。

这会在屏幕上显示 res.json(input),而不是测试 json

var mongo = require('mongodb');
var mongoose = require('mongoose');

var cors = require('cors');

// Basic Configuration 
var port = process.env.PORT || 3000;
process.env.DB_URI="omg it's my secret url"

// Connect to DB.
mongoose.connect(process.env.DB_URI, { useNewUrlParser: true, useUnifiedTopology: true }).
catch(error => handleError(error));

mongoose.connection.on('error', err => {
  console.log(err);
});

app.use(cors());



  //First we create a schema and Model in MongoDB.
  const urlSchema = new mongoose.Schema({ 
  original_url: String,
  short_url: Number 
  }); 

  const urlModel = mongoose.model('urlModel', urlSchema);

app.post(/PATH, function(req, res, done) {


  //Now we check if the input-url was actually valid.  
  if(!/(^https:\/\/)/.test(req.body.url)){
    res.json({error: "Invalid url"});
  } 

  //If it's valid we will start creating a model in the DB.
  else {
    var userUrl = req.body.url;
    var urlNumber = 0;

    var input = new urlModel({
      original_url: userUrl
    });


  //Now we check if the url was already added to the database and return a new or updated item.
    urlSchema.pre('save', function (next) {
      var query = {'original_url': userUrl };

      urlModel.findOneAndUpdate(query, userUrl, {upsert: true}, function(err, doc) {
      if (err) return res.send(500, {error: err});
      res.json({'test': 'test'});
      });
    });

      res.json(input);
      urlNumber++;

    input.save(function(err, data) {
      if (err) return console.log(err);
      done(null, data);
    });
  };
});

如您所见,我在更新要附加到数据库中 url 的号码时也遇到了问题,因为我在调用开始时将 0 重新分配给 urlNumber。一定是因为太晚了,但我似乎找不到正确更新该号码的方法。我尝试了两个变量并将它们相互检查并检查了 if(urlNumber > 0),但这是我仍在解决的问题。看起来很简单。。

无论如何,这里的问题是:为什么 findOneAndUpdate 似乎没有更新?返回的 res.json(input) 每次都会显示一个新的“_id”,这告诉我它确实每次运行都会创建新模型。

示例返回

#1

{
_id: eksdjh3948wryeids293ren12;
original_url: "https://www.correct.com"
short_url: 0
}



#2

{
_id: eksdjh3948wryeids293ren13; // (<----- NEW NUMBER)
original_url: "https://www.correct.com"
short_url: 0
}

【问题讨论】:

  • 那是实际的代码吗?我没有看到任何更新运算符,并且从未为 urlNumber 赋值。
  • 是的。抱歉,我想保留它以免混淆问题。问题已相应编辑。我还添加了所需的猫鼬部分。
  • 我还在最后使用 urlNumber++ 进行更新(或简单的“+=”),但显然我每次运行代码时都会重新分配它。

标签: javascript node.js mongodb mongoose


【解决方案1】:

你的pre('save' function(next) {})钩子没有调用next()

【讨论】:

    【解决方案2】:

    原来 .pre 钩子不适用于 findOneAndUpdate!如果我只是删除它,代码现在可以按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2017-05-06
      • 2020-07-11
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      相关资源
      最近更新 更多