Как преобразовать ответ аутентификации в массив объектов? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь получить ответ пользователей, используя функцию auth, и мне нужно создать лист Excel, используя библиотеку xlsx-populate, и я могу преобразовать это в массив объектов, поскольку ограничение равно 1000, поэтому есть несколько массивов объектов. и я не могу понять, как я могу решить эту проблему. В этой проблеме я просто извлекаю результаты, используя auth, и пытаюсь получить результаты в массив объектов. и я также пытался использовать объекты для перехода в лист Excel, но он дает лист Excel с последним ответом 1000 запросов

const admin = require("firebase-admin");
const momentTz = require("moment-timezone");
const XlsxPopulate = require("xlsx-populate");
momentTz.suppressDeprecationWarnings = true;
const {
  alphabetsArray
} = require("./constant");
var start = momentTz().subtract(4, "days").startOf("day").format();
var start = momentTz(start).valueOf();
const end = momentTz().subtract(1, "days").endOf("day").format();
const  listAllUsers = async(nextPageToken) =>{
  const [workbook] = await Promise.all([
    XlsxPopulate.fromBlankAsync()
  ]);
  const reportSheet = workbook.addSheet("Signup Report");
  workbook.deleteSheet("Sheet1");

  reportSheet.row(1).style("bold", true);
  [
    "Date",
    "TIME",
    "Phone Number"
  ].forEach((field, index) => {
    reportSheet.cell(`${alphabetsArray[index]}1`).value(field);
  });
  let count = 0
  // List batch of users, 1000 at a time.


  const data = [];
  admin
    .auth()
    .listUsers(1000, nextPageToken)
    .then (async  (listUsersResult) => {

      listUsersResult.users.forEach((userRecord) =>{

        const time = userRecord.metadata.creationTime;

        const timestamp = momentTz(time).valueOf();
        //   console.log(timestamp)


        if (timestamp >= 1585704530967 ) {
          console.log(time);
          let column = count+2;
          count++;
          data.push(userRecord.toJSON())
          reportSheet.cell(`A${column}`).value(time);

          reportSheet.cell(`C${column}`).value(userRecord.phoneNumber);

        }
      });

   console.log(JSON.stringify(data))//this is the array of the object and i am getting after 1000 response 
      if (listUsersResult.pageToken) {

        // List next batch of users.
        listAllUsers(listUsersResult.pageToken);
        await workbook.toFileAsync("./SignUp.xlsx");
      }
    })
    // .catch(function (error) {
    //   console.log("Error listing users:", error);
    // });
    // const datas = []
    //   datas.push(data)
    //   console.log(datas)
    return ;
}
// Start listing users from the beginning, 1000 at a time.
listAllUsers();


and the output i am getting is like this 
[]
[]
[]
[]
[]
i want to convert this into a single array of response

1 Ответ

0 голосов
/ 02 мая 2020

У вас есть состояние гонки. Когда вы выполняете console.log(JSON.stringify(data)), ваш listUserQuery выполняется (и в асинхронном режиме c), и у вас еще нет ответа при печати массива. Таким образом, массив пуст.

Попробуйте это (я не уверен в этом оптимальном решении, я не nodeJS dev)

  admin
    .auth()
    .listUsers(1000, nextPageToken)
    .then (async  (listUsersResult) => {

      listUsersResult.users.forEach((userRecord) =>{

        const time = userRecord.metadata.creationTime;

        const timestamp = momentTz(time).valueOf();
        //   console.log(timestamp)


        if (timestamp >= 1585704530967 ) {
          console.log(time);
          let column = count+2;
          count++;
          data.push(userRecord.toJSON())
          reportSheet.cell(`A${column}`).value(time);

          reportSheet.cell(`C${column}`).value(userRecord.phoneNumber);

        }
      }
      console.log(JSON.stringify(data))//this is the array of the object and i am getting after 1000 response 
      if (listUsersResult.pageToken) {

        // List next batch of users.
        listAllUsers(listUsersResult.pageToken);
        await workbook.toFileAsync("./SignUp.xlsx");
      }
    );
...