Это мой первый проект с mongodb, и я разрабатываю сокращение URL с использованием express
и mongoose
. У меня проблема с возвратом данных из функции обратного вызова.
У меня есть две схемы:
//Store the url, corresponding short url and number of clicks.
const urlSchema = new Schema({
url: {
type: String,
required: true
},
short: {
type: Number,
require: true,
unique: true
},
clicks: {
type: Number,
required: true,
default: 0
}
});
//Stores the number of documents in URL Schema.
const urlCounter = new Schema({
count: {
type: Number,
default: 1
}
});
и функция обработчика для сохранения документов
//Count and increment the number of documents in URLSchema
const incrementCounter = (callback) => {
URLCounter.findOneAndUpdate({}, { $inc: {count: 1 } }, (err, counter) => {
if (err) return console.error(err);
if (counter) {
callback(counter.count);
}
else {
const newCounter = new URLCounter();
newCounter.save((err, counter) => {
if (err) return console.error(err);
URLCounter.findOneAndUpdate({}, { $inc: {count: 1 } }, (err, counter) => {
if (err) return console.error(err);
callback(counter.count);
});
});
}
});
}
const shortenURL = (url) => {
if (!verifyURL(url)) {
return {error: "invalid URL"};
}
//first check if the url is already shortened and stored
return URLSchema.findOne({url: url}, (err, storedURL) => {
if (err) return console.error(err);
if (storedURL) {
//if URL is already shortened and stored
return { original_url: storedURL.url, short_url: storedURL.short };
}
else {
//if URL isn't already shortened and stored
incrementCounter((count) => {
const newURL = new URLSchema({
url: url,
short: count
});
newURL.save((err) => {
if (err) return console.error(err);
return { original_url: url, short_url: count };
});
});
}
});
}
Код на Github
Проблема в функции shortenURL
. Я пытаюсь вернуть JS objects
внутри блока if-else
, но он возвращает результат URLSchema.findOne
. Как вернуть objects
блок from if-else
?? Пожалуйста, помогите мне!! Спасибо тебе.