簡體   English   中英

Mongoose findOneAndUpdate 在節點中找不到(或更新)

[英]Mongoose findOneAndUpdate doesn't find (or update) in Node

我正在嘗試將用戶輸入(url)添加到具有 Mongoose 的數據庫中,但也檢查添加的數據是否已經存在。 相反,它似乎每次都在創建一個新的 model。

這在屏幕上顯示了 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
}

你的pre('save' function(next) {})鈎子沒有調用next()

原來 .pre 掛鈎不適用於 findOneAndUpdate,如果我只是刪除它。 代碼現在按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM