【发布时间】: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