Переменная не может быть изменена внутри findOne - PullRequest
0 голосов
/ 21 июня 2019

Я хочу создать быстрый файл Util, который будет содержать несколько функций, таких как user_id для его имени.Как показано на рисунке ниже, я пытался сохранить значение во всем коде, но переменная "name" не затрагивалась внутри .then(user => {}) по некоторым причинам

Я пытался вернуть значение напрямую, не используя переменную длясохрани это.Я отладил и код работает нормально, и он попадает в if(!user){}else{} отлично.Пользователь, возвращенный Mongoose, работает, и я могу консоль записать в журнал user.username (не могу вернуть его, либо могу сохранить его в переменной, что я и делаю в коде ниже)

const User = require('../models/users')

exports.id2name = (id) => {
  let name = 'none'
  User.findOne({_id: id}).then(user => {
    if (!user) {
      name = 'Unknown'
    } else {
      name = user.username
    }
  }).catch(err => console.log(err))
  return name
}

Я не получаю никаких ошибок на моей консоли.В результате он возвращает 'none', даже если он попадает в оператор else внутри запроса mongoose.

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Вы получаете этот результат для асинхронного поведения JavaScript.

Вы можете попробовать этот код для получения желаемого результата.

exports.id2name = async (id) => {
 try{
   let name = 'none'

   const user = await User.findOne({_id: id});
   if(user) {
     name = user.username;
   } else {
     name = 'Unknown';
   }
  return name;
 } catch(e) {
   console.log(e);
 }
}
0 голосов
/ 21 июня 2019

Это асинхронный возврат.Я имею в виду, что вам может потребоваться использовать обратный вызов, Promise или другой асинхронный способ для решения этой проблемы, например:

const User = require('../models/users')

exports.id2name = (id, callback) => {
  User.findOne({_id: id}).then(user => {
    if (!user) {
      callback(null, 'Unknown')
    } else {
      callback(null, user.username)
    }
  }).catch(callback)
}

или обещание:

const User = require('../models/users')

exports.id2name = (id) => {
  return new Promise((resolve, reject) => {
    User.findOne({_id: id}).then(user => {
      if (!user) {
        resolve('Unknown')
      } else {
        resolve(user.username)
      }
    }).catch(reject);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...