Преобразование нескольких CSV-файлов в json синхронно в nodejs - PullRequest
0 голосов
/ 06 февраля 2020
exports.upload = async (req, res) => {
  if (!req.files) {
    ResponseHandler.notFound(res, ERROR.ALL_FIELD_REQUIRED);
  }

  const files = req.files;

  for(let file of files){
    const csvFilePath = file.path;

    fs.readFile(csvFilePath, 'utf-8', async (err, fileContent) => {
      if (err) {
        return ResponseHandler.internalServerError(
          res,
          ERROR.INTERNAL_SERVER_ERROR
        );
      }
      const options = {
        delimiter: ',',
        quote: '"'
      };

      const jsonObj = csvjson.toObject(fileContent, options).map(element => {
        return {
          guid: element.guid || null,
          name: element.name || null,
          whenChanged: element.whenChanged || null,
          whenCreated: element.whenCreated || null,
          co: element.co || null,
          company: element.company || null,
          givenName: element.givenName || null,
          sn: element.sn || null,
          profileImage: element.profileImage || null,
          designation: element.designation || null,
          jobTitle: element.jobTitle || null,
          department: element.department || null,
          ward: element.ward || null,
          site: element.site || null,
          region: element.region || null,
          offer: element.offer || null,
          isAppUser: element.isAppUser || null
        };
      });

      try {
        await UserService.createUsers(jsonObj);
      } catch (err) {
        return ResponseHandler.internalServerError(
          res,
          ERROR.INTERNAL_SERVER_ERROR
        );
      }
    });
  }
  return ResponseHandler.send(res, STATUS.SUCCESS, SUCCESS.FILE_UPLOADED);
};

У меня проблема с синхронным выполнением кода, поскольку сначала должно выполняться l oop, а затем должен быть получен ответ. Пожалуйста, предоставьте мне решение, используя async / await, если это возможно. Этот API загрузки принимает несколько файлов в качестве входных данных. также конвертируется из csv в json с использованием пакетов fs и csv json.

1 Ответ

1 голос
/ 06 февраля 2020

Вы выполняете вызов в стиле обратного вызова для l oop, который не работает, вы ожидаете, что он будет работать. Вам нужно обернуть его в обещание или использовать обещанную версию фс. Примерно так

const fs = require("fs").promises;

exports.upload = async (req, res) => {
  if (!req.files) {
    ResponseHandler.notFound(res, ERROR.ALL_FIELD_REQUIRED);
  }

  const files = req.files;

  for (const file of files) {
    const csvFilePath = file.path;

    // eslint-disable-next-line no-loop-func
    const fileContent = await fs.readFile(csvFilePath, "utf-8");
    const options = {
      "delimiter": ",",
      "quote": "\""
    };

    // eslint-disable-next-line complexity
    const jsonObj = csvjson.toObject(fileContent, options).map(element => {
      return {
        "guid": element.guid || null,
        "name": element.name || null,
        "whenChanged": element.whenChanged || null,
        "whenCreated": element.whenCreated || null,
        "co": element.co || null,
        "company": element.company || null,
        "givenName": element.givenName || null,
        "sn": element.sn || null,
        "profileImage": element.profileImage || null,
        "designation": element.designation || null,
        "jobTitle": element.jobTitle || null,
        "department": element.department || null,
        "ward": element.ward || null,
        "site": element.site || null,
        "region": element.region || null,
        "offer": element.offer || null,
        "isAppUser": element.isAppUser || null
      };
    });
    try {
      await UserService.createUsers(jsonObj);
      // eslint-disable-next-line no-catch-shadow
    } catch (err) {
      return ResponseHandler.internalServerError(
        res,
        ERROR.INTERNAL_SERVER_ERROR
      );
    }
  }
  return ResponseHandler.send(res, STATUS.SUCCESS, SUCCESS.FILE_UPLOADED);
};


Надеюсь, это поможет. Возможно, вам придется изменить кое-что здесь или там, но вы получите представление.

...