首页 > 解决方案 > getting undefined for a function used in another function

问题描述

I'm getting the required result from console.log in getuser(), but I'm getting undefined when used it in another function

let getuser = (id) => {
  user.findById(id, (err, user) => {
    if (err || !user) {
      return "wrong user id";
    } else {
      let { name, _id } = user;
      console.log(JSON.stringify({ name, _id }));
      return { name, _id };
    }
  });
};

I'm getting undefined when i use getuser() in send()

exports.send = (req, res) => {
let {id}=req.body
let a=getuser(req.User._id)
let b=getuser(req.body.id)
console.log(a)
console.log(a)
let message = new messages({
                user1: a,
                user2: b,
              });
              message.save((err, saved) => {
                if (err) {
                  return res.json(err);
                } else {
                  return res.json(saved);
                }
              });
            } 

im getting undefined in

console.log(a) console.log(a)

标签: javascriptnode.jsfunction

解决方案


您可能希望对该getuser方法使用 Promise:

let getuser = (id) => new Promise((resolve, reject) => {
  user.findById(id, (err, user) => {
    if (err || !user) {
      reject("wrong user id");
    } else {
      let { name, _id } = user;
      console.log(JSON.stringify({ name, _id }));
      resolve({ name, _id });
    }
  });
});

该操作看起来是异步的,因此您需要等待结果才能继续。这意味着您的getuser调用需要处理承诺/异步值:

let a = await getuser(req.User._id)
let b = await getuser(req.body.id)

当然,await必须在标有 的函数中使用async。如果其中任何一个不清楚,请阅读 Promises 和 async/await - 它们对于使用数据库、API 等是绝对必要的。可以通过更改导出行来立即使用它:

exports.send = async (req, res) => {

但我不知道这适用于什么环境,所以我不能说这是否可以开箱即用。

请注意,我根本没有对此进行测试,因为这是一个相当不完整的示例。我所建议的只是理论上的。


推荐阅读