You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用module.exports封装MongoDB updateOne查询返回undefined问题求助

问题

我首次使用module.exports创建了一个用于在MongoDB中记录商品购买信息的模块,需要返回updateOne()查询的结果,以便在main.js中获取modifiedCount信息,但目前调用后返回undefined。我知道可以用回调函数或Promise(更推荐Promise),想针对我的代码实现正确的写法。

原模块代码(recordPurchase.js)

const recordPurchase = (userid, item, price) => {
    db.collection("users").updateOne({ userid: userid }, { $push: { purchases: { item: item, price: price } } })
        .then((result) => {
            if (result.modifiedCount > 0) {
                console.log("Success");
                return result; //return the updateone information
            }
        })
        .catch((err) => {
            console.log("Error recording purchase: " + err)
        })
}

module.exports = recordPurchase;

原调用代码(main.js)

if (msg.content === "test") {
    const userid = "12345";
    const item = "Some item name";
    const price = 10;
    const result = recordPurchase(userid, item, price)
    console.log(result); //returns updateone/result information
}
解决方案

问题核心是你的recordPurchase函数没有返回Promise对象,所以调用时拿到的是undefined。MongoDB的updateOne本身就返回Promise,只需让函数把整个Promise链返回出去,同时完善错误处理即可:

修改后的recordPurchase.js

const recordPurchase = (userid, item, price) => {
    // 返回整个Promise链,让调用方可以后续处理
    return db.collection("users").updateOne(
        { userid: userid }, 
        { $push: { purchases: { item: item, price: price } } }
    )
    .then((result) => {
        if (result.modifiedCount > 0) {
            console.log("Success");
        }
        // 无论是否修改成功,都返回完整结果,交给调用方判断
        return result;
    })
    .catch((err) => {
        console.error("Error recording purchase:", err);
        // 抛出错误,让调用方可以捕获处理
        throw err;
    });
}

module.exports = recordPurchase;

修改后的main.js(两种调用方式)

方式1:使用async/await(更直观易读)

// 注意:这段代码如果放在函数内,需要给外层函数加上async关键字
if (msg.content === "test") {
    const userid = "12345";
    const item = "Some item name";
    const price = 10;
    try {
        const result = await recordPurchase(userid, item, price);
        console.log("更新结果:", result);
        // 直接获取modifiedCount
        console.log("修改的文档数量:", result.modifiedCount);
    } catch (err) {
        console.error("处理购买记录失败:", err);
    }
}

方式2:使用.then()/.catch()链式调用

if (msg.content === "test") {
    const userid = "12345";
    const item = "Some item name";
    const price = 10;
    recordPurchase(userid, item, price)
    .then((result) => {
        console.log("更新结果:", result);
        console.log("修改的文档数量:", result.modifiedCount);
    })
    .catch((err) => {
        console.error("处理购买记录失败:", err);
    });
}

内容的提问来源于stack exchange,提问作者user874737

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:24:59