首页 > 解决方案 > 从从 3rd 方 api 返回的对象创建读取流

问题描述

我有一个一个来自第 3 方 api 的 JSON 对象,我想从中创建一个可读流,然后通过管道传输该 JSON 以创建一个 csv,然后将 csv 传输到客户端。如何从 JSON 对象创建可读流?

    const fileName = `Data.csv`;
    res.set('Content-Type', 'text/csv');
    res.setHeader('Content-disposition', 'attachment; filename=' + fileName);
    res.flushHeaders();
    const rs = new stream.Readable({ objectMode: true });
    rs._read = () => {}; 
    // not really a 3rd party api, calling populate over http as data 
    // is in another database 
    const itemCursor = OfferItem.find(query)
        .read('sp')
        .sort('purchase_date')
        .cursor();

    itemCursor.eachAsync(async (offerItemData) => {
        offerItemData = await UserService.populateUser(offerItemData, 
           {
            path: 'purchased_by',
            select: '_id first_name last_name email phone',
            options: {
                readPreference: 'secondaryPreferred'
            }
        });

        offerItemData = await UserAddressService.populateUserAddress(offerItemData, {
            path: 'delivery.user_address',
            options: {
                readPreference: 'secondaryPreferred'
            }
        });


        const sku = offerItemData.sku_id ? offerItemData.sku_id : offerItemData._id;
        const user = offerItemData.purchased_by;
        const name = humanize.capitalizeAll(`${user.first_name} ${user.last_name}`);
        const { email, phone } = user;
        const coin = offerItemData.coin_price;
        let address;
        let pinCode;
        let code = '';

        const deliveryAddress = offerItemData.delivery.user_address;
        if (deliveryAddress) {
            address = `${deliveryAddress.basic}, ${deliveryAddress.area}, ${deliveryAddress.city_str}`;
            pinCode = deliveryAddress.pin_code;
        }

        if (offerItemData.discount) {
            code = offerItemData.discount.code;
        }
        // transform the data here
        const data = {
            sku,
            name,
            address,
            pinCode,
            phone,
            email,
            code,
            coin
        };
        console.log(data);
        rs.push(data);
    });
    rs.push(null);
    rs.pipe(JSONStream.stringify()).pipe(jsonParser).pipe(res);

上面的代码不起作用。考虑从一个函数制作流,该函数将随着时间的推移返回填充的对象,但我不知道该怎么做。

标签: node.jsnode-streams

解决方案


推荐阅读