首页 > 解决方案 > 只有当所有 mongoose model.save() 都已保存在 express js 中时,我如何才能返回响应?

问题描述

我正在做一些快速的 mongo restful 应用程序,并且我已经创建了一种从网站上抓取数据并使用 mongoose 保存到 MongoDB 的方法。当我循环遍历每个数据并调用 model.save() 并等待循环停止或成功然后将响应提供给客户端时,我真的很困惑如何为客户端返回响应。

这是我的方法来抓取数据并循环遍历每个然后调用猫鼬 save() 以将数据一一保存。

router.get('/', async (req, res) => {
    let url = 'https://www.bi.go.id/id/moneter/informasi-kurs/transaksi-bi/'

    await axios.get(url)
        .then(async response => {
            let html = response.data;
            let $ = cheerio.load(html);
            let box = $('.box_gray').html()
            let insertedDocs = [];
            let coba = await $(box).find('.table1 > tbody > tr').slice(1, 26).each(async (i, elem) => {
                let arrayData = [];
                $(elem).find('td').slice(0, 4).each((i, elem) => {
                    arrayData.push($(elem).text().trim())
                })

                // get currency ref id
                Currency.findOne({code: arrayData[0]}).exec(async (err, currency) => {
                    if (err) return res.status(500).json({message: err.message})
                    if (currency) {
                        // set object
                        let currencyDataObj = {
                            '_currency': '',
                            'value': '',
                            'sell': '',
                            'buy': ''
                        }
                        currencyDataObj._currency = currency._id
                        currencyDataObj.value = parseFloat(arrayData[1])
                        currencyDataObj.sell = parseFloat(arrayData[2].replace(/[,]/g, ''))
                        currencyDataObj.buy = parseFloat(arrayData[3].replace(/[,]/g, ''))
                        // insertedDocs.push(currencyDataObj)

                        let currencyData = new CurrencyData(currencyDataObj);

                        const newCurrencyData = await currencyData.save();
                        console.log(newCurrencyData)
                        // let successResponse = {
                        //     status: 'success',
                        //     message: `success save kurs data to db with id ${newCurrencyData._id}`
                        // }
                        // res.json(successResponse);
                    } else {
                        console.log('dont have an id', arrayData[0])
                    }
                })
            })

            Promise.all([coba]).then(values => {
                console.log(values);
            });
        })
});

module.exports = router;

架构

const currencySchema = new mongoose.Schema({
    code: {type: String, uppercase: true, required: true, unique: true, dropDups: true},
    symbol: {type: String, required: true},
    digitalCode: {type: Number, required: true},
    name: {type: String, required: true},
    country: {type: String, required: true},
    currencyData: [{type: mongoose.Schema.Types.ObjectId, ref: 'CurrencyData'}]
})

const currencyDataSchema = new mongoose.Schema({
    _currency: {type: mongoose.Schema.Types.ObjectId, ref: 'Currency'},
    value: {type: Number, required: true},
    sell: {type: Number, required: true},
    buy: {type: Number, required: true},
    lastUpdatedDateISO: {type: Date},
})

exports.Currency = mongoose.model('Currency', currencySchema);
exports.CurrencyData = mongoose.model('CurrencyData', currencyDataSchema);

我已经尝试过 promise.all() 但它不会等待 mongoose.save() 完成。在此先感谢您的帮助!

标签: mongodbexpressmongoose

解决方案


推荐阅读