Как я могу сделать этот машинопись / javascript код более `функциональным стилем программирования` - PullRequest
0 голосов
/ 24 апреля 2020

Я изучаю машинопись / javascript и изучаю функциональное программирование. Вполне возможно, что некоторый код здесь может показаться неправильным для опытных javascript программистов. Так что в основном я пытаюсь

  1. передать удаленный файл - я использую got
  2. конвертировать каждый CSV в json - я использую csvto json
  3. На этом этапе я могу по отдельности писать в mongodb, но это неэффективно, поэтому я собираю это в переменную 5000 json объектов и затем записываю в базу данных. - Я использую mon goose

Мне не нравится эта глобальная переменная, и, безусловно, есть лучший способ сделать то, что я делаю. Кроме того, поскольку данные не всегда кратны 5000, у меня могут быть строки, которые не были записаны. Мне тоже нужно это исправить. Спасибо.

import csv from "csvtojson";
import got from "got";
import { CountyDocument, County } from "../models/County";
import logger from "../util/logger";
import {BulkWriteOpResultObject} from "mongodb";

const writetoDataBase = (data: any,): Promise<BulkWriteOpResultObject> => {
    return County.bulkWrite(data);
};

let collect: Array<CountyDocument> = [];

function processIndividualRecord(data: CountyDocument, linenumber: number) {
    let prom;
    if (linenumber !== 0 && linenumber % 5000 === 0) {
        const copyarray = collect.map(x => {
            const upsertDoc = {
                updateOne: {
                    filter: { county: x.county, date: x.date, state: x.state },
                    update: { cases: x.cases, deaths: x.deaths, fips: x.fips },
                    upsert: true
                }
            };
            return upsertDoc;
        });
        prom = writetoDataBase(copyarray).then(value => {
            logger.debug(`writing to DB at ${linenumber}`);
        });
        collect = [];
    } else {
        collect.push(data);
        prom = Promise.resolve();
    }
    return prom;
};
export const saveschedule = () => {
    return csv().fromStream(got.stream(<some url>))
        .subscribe(processIndividualRecord, (err: CSVError) => {
            logger.error(`error processing the rows ${err.message} and the stack is ${err.stack}`);
            process.exit(1);
        }, () => {
            logger.info("DONE");
        });

};
...