简体   繁体   English

如何正确使用 User.findOne({ userID: searchUserID } ??? (目前没有得到返回值)

[英]How to use User.findOne({ userID: searchUserID } correctly ??? (currently not getting return value)

I am currently trying to implement an update / put functionality in my node.js-project and having issues I have absolutely no clue, where that comes from.我目前正在尝试在我的 node.js-project 中实现更新/放置功能,并且遇到了我完全不知道的问题,这是从哪里来的。 (also I am a JS beginner). (我也是 JS 初学者)。 I am using express, MongoDB and mongoose.我正在使用快递、MongoDB 和猫鼬。

Problem is in this method (or how I call it):问题在于这种方法(或者我如何称呼它):

User.findOne({ userID: searchUserID })

Kontext of the the method, that is called:该方法的上下文,称为:

/* find User by userID */ 
// calling sequence: UserService > findUserBy() callback

    function findUserBy(searchUserID, callback) {
        logger.debug(`UserService: searching for user with userID '${searchUserID}'...`)
        let query = User.findOne({ userID: searchUserID }) 
        query.exec(function (err, user) {/*content*/})
    }

When I call it directly from the UserRoute module like this:当我像这样直接从 UserRoute 模块调用它时:

/* get one user */
// calling sequence: UserRoute > router.get('/:userID') callback > userService.findUserBy() callback

    router.get('/:userID', function (req, res, next) {
        userService.findUserBy(req.params.userID, function (err, user) {/* content */})
    })

then it all works fine.然后一切正常。

But when I want to use that function from another function inside the same module ( UserService ):但是当我想从同一个模块( UserService )内的另一个函数中使用该函数时:

/* update one User */
// calling sequence: UserService > updateUser > findUserBy() callback

    function updateUser(userID, newUserData, callback) {
        findUserBy(userID, function (err, user) {...})
        let id = user.body.id
        /* more content */
    }  

Then I am getting an error, since 'user' is not defined.然后我收到一个错误,因为未定义“用户”。

Obviously User.findOne({ userID: searchUserID }) is working in the first case and returns a user.显然User.findOne({ userID: searchUserID })在第一种情况下工作并返回一个用户。 But it is not working in the second case.但它不适用于第二种情况。

I have used the debugger to check the parameters, that are delivered when calling the findOne function.我使用调试器检查了调用 findOne 函数时传递的参数。

The 1st parameter is: searchUserID第一个参数是:searchUserID
and the value is: 'manfred'值是:'manfred'

The 2nd parameter is a callback function, but it doesn't come this far anyway.第二个参数是一个回调函数,但它并没有走到这一步。

The first parameter is exactly the same, no matter whether I call it directly from UserRoute.js or the UserService.js .第一个参数完全一样,不管我是直接从UserRoute.js调用还是从UserService.js调用。

I have also compared the content of the 'query'-objects in both cases.我还比较了这两种情况下“查询”对象的内容。 It has a bit more then 3700 lines and they have differences in like 10 lines... some veeeery long numbers that I don't understand.它有超过 3700 行,它们之间的差异大约有 10 行……一些我不明白的长数字。 Probably random Numbers, timeStamps or ...I really have no clue (but if someone needs them I can look them up again).可能是随机数字、时间戳或......我真的不知道(但如果有人需要它们,我可以再次查找它们)。

Why is User.findOne({ userID: searchUserID }) not working in the second case?为什么User.findOne({ userID: searchUserID })在第二种情况下不起作用?

EDIT : my full functions (without shortening them with 'content)编辑:我的全部功能(没有用'内容缩短它们)

in UserService.js :UserService.js中:

//find User by userID
function findUserBy(searchUserID, callback) { //UserService > findUserBy() callback
    logger.debug(`UserService: searching for user with userID '${searchUserID}'...`)
    let query = User.findOne({ userID: searchUserID }) // query object erstellen
    query.exec(function (err, user) { //query wird asynchron ausgeführt
        if (err) {
            logger.error(err.message)
            return callback(err.message)  // callback übergibt fehlernachricht
        }
        if (user) {  // hier wirkt null wie false
            logger.debug(`Found userID: ${searchUserID}`)
            callback(null, user)
        }
        else {
            //logger.error("Did not find user for userID: " + searchUserID)
            callback(`Did not find user with userID: ${searchUserID}`, user)  // callback übergibt fehlernachricht
        };
    })
}

This one is not done yet, but that comes after:这个还没有完成,但是之后:

    // update User
    function updateUser(userID, newUserData, callback) {
        logger.debug(`Updating user '${userID}'...`)
        findUserBy(userID, function (err, user) { //UserService>updateUser>findUserBy() callback
            if (user) {
                logger.debug(user)
                    (null, user.body)
            }
            else {
                logger.error(err)
                return console.log("Did not find any User with this userID" + [], null)
            }
        })
        //logger.debug("user:" + user, err)
        console.log("so far so good...")
        let id = user.body.id
        let user = new User()
        Object.assign(user, user.body)
        Object.assign(user, newUserData)
        user.body.id = id
        user.save(function (err) {
            if (err) {
                logger.debug("Could not create user account: " + err)
                return callback("Could not create user account", null)
            }
            else {
                callback(null, user)
            }
        })
    }

in UserRoute.js :UserRoute.js中:

/* update one User */ 
    router.put('/:userID', function (req, res, next) {
        userService.updateUser(req.params.userID, req, function (err, user) {
            if (user) {
                //res.send(Object.assign(user))
                logger.debug(user)
                res.send(`User ${req.body.userID} sucessfully updated. \r\r new Json-Body: \r ` + user)
            }
            else {
                logger.error(err)
                res.send("Did not find any User with this userID" + [])
            }
        })
    })


/* get one user */
router.get('/:userID', function (req, res, next) {
    userService.findUserBy(req.params.userID, function (err, user) { //UserRoute > router.get('/:userID') callback > userService.findUserBy() callback
        if (user) {
            res.send(user)
            logger.debug(user)
            //res.json(user)
        }
        else {
            logger.error(err)
            res.send("Did not find any User with this userID" + [])
        }
    })
})

you need to convert req.params.userID to an object Id For eg :您需要将 req.params.userID 转换为对象 ID 例如:

Types.ObjectId(req.params.uuid)

also Import Types还导入类型

import { Types } from 'mongoose'

It does not work because you try to access the data while you still fetching it from the DB.它不起作用,因为您在仍然从数据库中获取数据的同时尝试访问数据。

My opinion: Dont use callbacks, they are pretty old and you will sooner or later land into an callback hell.我的观点:不要使用回调,它们已经很老了,你迟早会陷入回调地狱。 Mongoose supports Promises. Mongoose 支持 Promise。 Rewrite your code a bit:稍微重写你的代码:

function findUserBy(searchUserID) {
    logger.debug(`UserService: searching for user with userID '${searchUserID}'...`)
    return User.findOne({ userID: searchUserID }).exec()
}

If you not provide an callback, your function will return an promise with either null or your user.如果您不提供回调,您的函数将返回一个带有null或您的用户的 Promise。

Lets rewrite your router a bit:让我们稍微重写一下你的路由器:

router.get('/:userID', async function (req, res, next) {
   let user = await userService.findUserBy(req.params.userID)
   console.log(user)
})

I made an async / await out of it.我做了一个async / await await only works in an async function and can await Promises. await仅适用于异步函数,并且可以等待 Promises。

If you do this now:如果你现在这样做:

async function updateUser(userID, newUserData) {
    let user = await findUserBy(userID)
    if(!user) {
       console.log("no user found")
    }
    let id = user.body.id
    /* more content */
}  

You should see some result.你应该看到一些结果。 I made updateUser an async function.我将updateUser异步函数。 So you can use await .所以你可以使用await But watch out.但要小心。 Async function returns an promise, so you will also need to use await on them.异步函数返回一个 Promise,因此您还需要在它们上使用await

If you ever see an callback as second argument, then its most of the time asynchronouse code.如果您曾经将回调视为第二个参数,那么它大部分时间都是异步代码。

Edited code:编辑代码:

function findUserBy(searchUserID) {
  return User.findOne({ userID: searchUserID }).exec(); // query object erstellen
}

async function updateUser(userID, newUserData) {
  let user = await findUserBy(userID);
  if (!user) throw "Cannot find user";
  let newUser = new User({ ...user.body, ...newUserData });
  return newUser.save();
}

/* update one User */

router.put("/:userID", async function(req, res, next) {
  try {
    let user = await userService.updateUser(req.params.userID, req.body);
    res.status(200).json(user);
  } catch (err) {
    res.status(404).json("Did not find any User with this userID" + []);
  }
});

/* get one user */
router.get("/:userID", async function(req, res, next) {
  try {
    let user = await userService.findUserBy(req.params.userID);
    if (!user)
      return res
        .status(404)
        .send("Did not find any User with this userID" + []);
    return res.status(200).json(user);
  } catch (err) {
    return res.status(500).json(err);
  }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM