Как вернуть данные из обратного вызова функции запроса mon goose? - PullRequest
0 голосов
/ 18 марта 2020

Это мой первый проект с 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 ?? Пожалуйста, помогите мне!! Спасибо тебе.

1 Ответ

0 голосов
/ 19 марта 2020

Я бы просто удалил return из URLSchema.findOne ({}), так как вы уже возвращаете json объекты внутри функции. Для дальнейшего улучшения я вернул бы ошибки в форме json для простоты обработки ошибок.

const shortenURL = (url) => {
  if (!verifyURL(url)) {   //first check if the url is already shortened and stored
    console.log('INVALID URL!!!')
    return { error: "invalid URL" };
  }
  else {
    URLSchema.findOne({ url: url }, (err, storedURL) => { // removed return 
      if (err) {
          console.log('URLSchema.findOne() error:', err)
          return {error: err}; // returns error in json
      }
      if (storedURL) {
        //if URL is already shortened and stored
        console.log('StoredURL url', storedURL.url)
        console.log('StoredURL short', storedURL.short)
        return { original_url: storedURL.url, short_url: storedURL.short };
      }
      else {
        //if URL isn't already shortened and stored
        console.log('URL IS NOT SHORTEN AT ALLLLL!')
        incrementCounter((count) => {
          const newURL = new URLSchema({
            url: url,
            short: count
          });
          newURL.save((err) => {
            if (err) 
                console.log('newURL.save() error:', err)
                return {error: err}; // returns error in json
            }
            console.log('Returning og url', url)
            console.log('Returning count', count)
            return { original_url: url, short_url: count };
          });
        });
      }
    });
  }
}
...