首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确使用User.findOne({ userID: searchUserID }?)(目前未获得返回值)

如何正确使用User.findOne({ userID: searchUserID }?)(目前未获得返回值)
EN

Stack Overflow用户
提问于 2022-05-07 22:02:16
回答 2查看 133关注 0票数 0

我目前正试图在node.js-项目中实现更新/放置功能,但我完全不知道这是从何而来。(我也是JS初学者)。我用的是快递,MongoDB和猫鼬。

问题在于这种方法(或我如何称呼它):

代码语言:javascript
运行
复制
User.findOne({ userID: searchUserID })

该方法的Kontext,即称为:

代码语言:javascript
运行
复制
/* 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*/})
    }

当我从UserRoute模块直接调用它时,如下所示:

代码语言:javascript
运行
复制
/* 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 */})
    })

那一切都很好。

但是,当我想从同一个模块(UserService)中的另一个函数中使用该函数时:

代码语言:javascript
运行
复制
/* 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 */
    }  

然后我得到一个错误,因为‘用户’是没有定义的。

显然,User.findOne({ userID: searchUserID })在第一种情况下工作,并返回一个用户。但这在第二种情况下行不通。

我使用调试器来检查在调用findOne函数时传递的参数。

第一个参数是: searchUserID

其价值是:“曼弗雷德”

第二个参数是回调函数,但它并不是那么远。

第一个参数完全相同,无论我是直接从UserRoute.js还是从UserService.js调用它。

在这两种情况下,我还比较了“查询”对象的内容。它有3700多条线,它们在10条线上有差异.一些我不明白的很长的数字。可能是随机数,timeStamps或...I确实毫无头绪(但如果有人需要它们,我可以再查一次)。

为什么User.findOne({ userID: searchUserID })在第二种情况下不起作用?

编辑:我的全部功能(不使用“内容”缩短它们)

UserService.js

代码语言:javascript
运行
复制
//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
        };
    })
}

这一项尚未完成,但这是继以下几项之后提出的:

代码语言:javascript
运行
复制
    // 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)
            }
        })
    }

UserRoute.js

代码语言:javascript
运行
复制
/* 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" + [])
        }
    })
})
EN

回答 2

Stack Overflow用户

发布于 2022-05-07 22:06:09

您需要将req.params.userID转换为对象Id,例如:

Types.ObjectId(req.params.uuid)

也是进口类型

代码语言:javascript
运行
复制
import { Types } from 'mongoose'
票数 0
EN

Stack Overflow用户

发布于 2022-05-07 23:16:23

它无法工作,因为您尝试访问数据,而仍然从DB获取数据。

我的观点是:不要使用回调,它们已经很老了,你迟早会陷入回调的地狱。猫鼬支持承诺。重写您的代码:

代码语言:javascript
运行
复制
function findUserBy(searchUserID) {
    logger.debug(`UserService: searching for user with userID '${searchUserID}'...`)
    return User.findOne({ userID: searchUserID }).exec()
}

如果不提供回调,则函数将向null或用户返回承诺。

让我们重写一下您的路由器:

代码语言:javascript
运行
复制
router.get('/:userID', async function (req, res, next) {
   let user = await userService.findUserBy(req.params.userID)
   console.log(user)
})

我用它做了一个async / awaitawait只在异步函数中工作,可以等待承诺。

如果你现在这么做:

代码语言:javascript
运行
复制
async function updateUser(userID, newUserData) {
    let user = await findUserBy(userID)
    if(!user) {
       console.log("no user found")
    }
    let id = user.body.id
    /* more content */
}  

你应该看到一些结果。我使updateUser成为一个异步函数。所以你可以使用await。但小心点。异步函数返回一个承诺,因此您还需要在它们上使用await

如果您曾经将回调看作第二个参数,那么它的大部分时间都是异步代码。

编辑代码:

代码语言:javascript
运行
复制
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);
  }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72156655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档