猫鼬findOneAndUpdate在Node中找不到(或更新)

时间:2020-05-04 23:36:02

标签: javascript node.js mongodb mongoose

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

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

System.getProperty("user.home")

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

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

示例返回

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);
    });
  };
});

2 个答案:

答案 0 :(得分:0)

您的pre('save' function(next) {})挂接未调用next()

答案 1 :(得分:0)

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