变量不能在findOne内部更改

时间:2019-06-21 03:37:40

标签: node.js express mongoose

我想制作一个快速的Util文件,其中应包含多个功能,例如user_id用作其名称。如下图所示,我试图在整个代码中保存该值,但是由于某些原因,变量“名称”在.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
}

我的控制台上没有任何错误。即使返回到猫鼬请求内的else语句中,它的结果也将返回“ none”。

2 个答案:

答案 0 :(得分:2)

对于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);
 }
}

答案 1 :(得分:0)

这是异步返回。我的意思是您可能需要使用回调,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);
  });
}