Чтение всех JSON в папке и получение их строк - PullRequest
0 голосов
/ 10 июля 2020

Есть папка с множеством JSON файлов, и все они получили объект с именем "name" Я хочу получить их строки и превратить их в строку, подобную этой

name0=UsernameExample;name1=Flowers;name2=Test; ...

число после имени - это индекс / количество json, например, если его имя 48, это 48-е json До сих пор я пытался читать только JSON из папки, но мне не удалось из конечно

let s = "";
  fs.readdir('/tmp/userdb/', (files) => {
  files.each(file => {
    name = file[file.keys()[0]]; 
  })})

Я уже могу преобразовать это

var other_users = (serialize({
      "sid0": 0,
      "name0": "user1",
      "pays0": "8521",
      "avatar0": "357",
      "onlinescore0": "50"
    }));

в это:

sid0=0;name0=user1;pays0=8521;avatar0=357;onlinescore0=50

с этим const

const serialize = obj =>
  Object.entries(obj).map(([k, v]) => `${k}=${v}`).join(';')

И я хочу отправить результат пользователю следующим образом

if (req.query.d === 'getRandomPlayers') {
    
    var sessionid = req.body.player_sid
    let user = require("./tmp/userdb/" + sessionid + ".json")
    
    var current_user = (serialize({
      player_name: user.name
    }));
      
    res.send("method_id=1665;" + current_user);
  }

Это должно быть похоже на res.send("method_id=1665;" + current_user + thefinalresult); thefinalresult это то, что все это должно go. current_user и прочее не имеет отношения к этому вопросу.

1 Ответ

0 голосов
/ 10 июля 2020

Предположим, что пример JSON файлов внутри /tmp/userdb/ имеет следующую структуру:

{
  "53874745": {
    "avatar": "372",
    "name": "BILLY",
    "onlinescore": "1",
    "pays": "8758"
  }
}

, вы можете сделать что-то вроде следующего:

const { promisify } = require("util");
const fs = require("fs");
const path = require("path");

const readdir = promisify(fs.readdir);
const readFile = promisify(fs.readFile);

async function process(excludedSessionId) {
  try {
    const entries = [];

    // get a list of all `JSON` files
    const jsonFiles = await readdir(
      path.join(__dirname, "./tmp/userdb/")
    ).then(
      (files) => files.filter(
        (file) => path.extname(file) === ".json" && !file.includes(excludedSessionId)
      )
    );

    // iterate through a list of all `JSON` files & read their content
    for (const [index, file] of jsonFiles.entries()) {
      const content = await readFile(
        path.join(__dirname, "./tmp/userdb/", file)
      ).then(JSON.parse);

      // create an object for a new entry
      const key = `sid${index}`;
      const keyValue = Object.keys(content)[0];

      // use the `spread syntax` to include the rest of the
      // properties in a new entry 
      const entry = {
        [key]: keyValue,
        ...content[keyValue],
      };

      entries.push(entry);
    }

    console.log(entries[0]);
    // { 
    //    sid0: '53874745', 
    //    avatar: '372', 
    //    name: 'BILLY', 
    //    onlinescore: '1', 
    //    pays: '8758'
    //  }

    const result = entries.map((entry) => serialize(entry)).join(";");

    console.log(result);
    // sid0=53874745;avatar=372;name=BILLY;onlinescore=1;pays=8758;
    // sid1=154261758;avatar=480;name=JESSEY;onlinescore=30;pays=8521;

    return result;
  } catch (error) {
    console.error(error);
    throw error;
  }
}
process("154261742");

Тогда, если вы ' Если вы хотите использовать эту функцию в обратном вызове вашего контроллера маршрута, вы можете сделать что-то вроде следующего:

app.get("/user", (req, res) => {
  // ...
  const excludedSessionId = req.body.player_sid;

  process(excludedSessionId)
    .then(result => {
      res.send(result);
    })
    .catch(error => {
      res.status(500).send("Something went wrong.");
    });
});

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...