【问题标题】:Some question about the async function with express JS NodeJS and Mongo db关于 express JS Node JS 和 Mongodb 的异步函数的一些问题
【发布时间】:2021-08-13 19:21:21
【问题描述】:

我对 express JS NodeJS 和 Mongo db 的异步函数有疑问。

我为用户创建了一个 api 调用函数,使用“student id”来查找他们的记录。 我在异步函数查找 user._id 时遇到问题 api 调用会比异步函数返回值更快地显示结果。

Result 将返回未定义的值。

API 路由器代码:

router.get('/user_record/:id', async (req, res) => {
    try{
        const sid = await getIdByStudentId(req.params.id)
        console.log("----- res : " + sid)
        res.json({"id": sid})

    }catch (err){
        console.log("check- 2")
        res.json({message: err})
    }
})


//Function
function getIdByStudentId(sid){
    console.log("input id: " + sid)
    const student =  User.find({studentid:sid }).exec().then(function (results){
        if(results.length > 0) {
            const studentId =  results[0]._id
            console.log("get Id: " + studentId)
            return results[0]._id
        }else{
            return ""
        }
    })
}

架构

const userSchema  = new mongoose.Schema({
    studentid:{
        type:String,
        required: true,
        unique: true
    },
    
    username:{
        type:String,
    },
    
    gender:{
        type:String,
    },
    ...
    createdAt:{
        type:Date,
        default: Date.now
    },

  
})

API 调用

http://XXXX.com/user_record/4

控制台日志返回

input id: 4 //<-- Log at async function 
res : undefined //<--- Log at api call  
get Id: 608915308462c0ccec435a97 // <--- Log at async function

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    您当前的 getIdByStudentId() 函数根本没有返回任何内容。

    让我们重新安排您的代码。你有这个:

    function getIdByStudentId(sid){
        console.log("input id: " + sid);
        const student = User.find({studentid:sid }).exec().then(something);
    }
    

    还有这个:

    function something(results) {
        if (results.length > 0) {
            const studentId = results[0]._id;
            console.log("get Id: " + studentId);
            return results[0]._id;
        } else {
            return "";
        }
    }
    

    当你从这个角度看代码时,你会期望something() 内部的return 语句对getIdByStudentId() 的返回值有什么影响吗?我不这么认为。

    你真正想写的是:

    function getIdByStudentId(sid) {
        return User.findOne({studentid: sid}).exec().then( (result) => result ? result._id : "" );
    }
    

    注意return。此外,.findOne() 定义为 "returns a single document, or null"。这比.find() 更合适。

    用法与您已有的完全一样:

    router.get('/user_record/:id', async (req, res) => {
        try {
            const sid = await getIdByStudentId(req.params.id);
            res.json({id: sid});
        } catch (err) {
            res.json({message: err});
        }
    });
    

    【讨论】:

    • 感谢您的帮助,我不确定何时返回函数的值。
    • @NapoleonWaiLunWong 您不能在异步函数中返回值。您可以返回该值的 promise。这就是我的功能所做的。等待 promise 解决是调用者的责任。这就是路由处理程序中的await 所做的。
    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2019-02-07
    • 2018-05-15
    • 2022-08-18
    • 2020-11-12
    • 2018-06-11
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多