从数组中的MongoDB向对象添加属性,然后在响应中发送它

问题描述 投票:0回答:1

我正在尝试使用以下代码在quoteValue数组的元素(在这种情况下为对象)中添加users键值。

当我打印出console.log(users[0])时,它没有显示quoteValueusers[0]值。但是,console.log(users[0].quoteValue)打印出quoteValue的实际值。

我不知道怎么可能。非常感谢您的帮助!

export async function get_client_users(req, res) {
    try {
        let users = await User.find({ role: { $eq: 'client' }, status: { $ne: 'deleted' } }, { name: 1, mobile: 1, email: 1, status: 1, ref_id : 1, _id: 1 });
        for(let i = 0; i < users.length; i += 1) {
            let quotes = await Quote.find({client: users[i]._id});
            const totalQuote = quotes.length;
            let cost = 0;
            for(let i = 0; i < quotes.length; i += 1) {
                cost += quotes[i].total_cost;
            }
            const result = {
                totalQuote: totalQuote,
                quoteValue: cost
            }

            Object.assign(users[i], result);
        }
        return res.status(200).json(users);
    } catch(e) {
        console.log(e);
        return res.status(400).json({ message: 'Technical Error. Please try again later.' });
    };
};
javascript node.js mongodb asynchronous async-await
1个回答
1
投票

如果可以创建新的https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment对象(在下面的代码中称为users,则我建议使用析构(updatedUsers):

export async function get_client_users(req, res) {
    try {
        let users = await User.find({ role: { $eq: 'client' }, status: { $ne: 'deleted' } }, { name: 1, mobile: 1, email: 1, status: 1, ref_id : 1, _id: 1 });
        let updatedUsers = [];
        for(let i = 0; i < users.length; i++) {
            let quotes = await Quote.find({client: users[i]._id});
            let quoteValue = 0;

            for(let i = 0; i < quotes.length; i++) {
                quoteValue += quotes[i].total_cost;
            }

            updatedUser = {
                ...users[i],
                totalQuote: quotes.length,
                quoteValue
            }
            updatedUsers.push(updatedUser);
        }
        return res.status(200).json(updatedUsers);
    } catch(e) {
        console.log(e);
        return res.status(500).json({ message: 'An error occurred. Please try again later.' });
    };
};

[我还做了一些更改,例如发生错误时发送500而不是400,通过直接将totalQuote分配给quotes.length删除了updatedUser.totalQuote变量的分配,还使用了i++代替i += 1循环中的for。我建议使用诸如ESLint(https://eslint.org/)或Prettier(https://prettier.io/)之类的linter,以提高代码的可读性。

[另外,我建议使用maphttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)遍历您的users对象,并使用reducehttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)从您的quoteValue属性中获取total_cost的值quotes,但这不在您的问题范围内。

© www.soinside.com 2019 - 2024. All rights reserved.