Как включить данные stati c и Dynami c в функцию рендеринга express, когда для части Dynami c используется обещание? - PullRequest
0 голосов
/ 05 мая 2020

Я работаю над веб-приложением с Node и Express и хочу отображать контент из разных JSON файлов. Некоторые из них содержат статическое c содержимое, такое как заголовки и метки столбцов для таблиц. Некоторые содержат пользовательские данные, которые могут динамически изменяться. Во-первых, я сделал две разные функции для чтения файлов JSON:

const readStaticData = filePath => {
 fs.readFile(filePath, 'utf-8', (err, staticData) => {
    if (err) throw err;
    JSON.parse(staticData);
 }); 
};

и это для динамических c данных:

const readData = filePath => new Promise((resolve, reject) => {
  fs.readFile(filePath, (err, fileData) => {
      if (err) {
          reject(err);
          return;
      }
      try {
          const object = JSON.parse(fileData);
          resolve(object);
      } catch(err) {
          reject(err);
      }
  });
});

И вот как мой router.get () выглядит так:

router.get('/', (req, res) => {
  Promise.all([
    readData('./JSON/dynamicData1.json'),
    readData('./JSON/dynamicData2.json')
  ])
  .then((data) => {
    res.render('home',
      {
        dynamicData1: data[0],
        dynamicData2: data[1]
      }
    );
  })
  .catch((err) => {
    console.log(err);
    res.status(500).end();
  });
});

Итак, у меня есть функция рендеринга внутри Promise, и я застрял, как я могу также включить содержимое stati c. Где я могу разместить свои функции readStaticData('./JSON/staticData1.json'); readStaticData('./JSON/staticData2.json'); для рендеринга? Они не зависят напрямую от содержимого Dynami c, например, заголовок всегда должен присутствовать независимо от того, есть данные пользователя или нет.

Надеюсь, я не упускаю важную информацию, это мой первый вопрос. . И еще я новичок в программировании. Если бы кто-то мог помочь, заранее большое спасибо!

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я бы сделал что-то вроде этого. Вы можете просто потребовать файл JSON и подготовить его к go, так как он является c.

const staticData = require('./path/to/staticData.json') 

// const readStaticData = filePath => {
//     fs.readFile(filePath, 'utf-8', (err, staticData) => {
//         if (err) throw err;
//         JSON.parse(staticData);
//     });
// };

const readData = filePath => new Promise((resolve, reject) => {
    fs.readFile(filePath, (err, fileData) => {
        if (err) {
            reject(err);
            return;
        }
        try {
            const object = JSON.parse(fileData);
            resolve(object);
        } catch(err) {
            reject(err);
        }
    });
});

router.get('/', (req, res) => {
    Promise.all([
        readData('./JSON/dynamicData1.json'),
        readData('./JSON/dynamicData2.json')
    ])
        .then((data) => {
            res.render('home',
                {
                    dynamicData1: data[0],
                    dynamicData2: data[1],
                    staticData
                }
            );
        })
        .catch((err) => {
            console.log(err);
            res.status(500).end();
        });
});
0 голосов
/ 05 мая 2020

fs.readFile всегда асинхронно, поэтому вы можете использовать readData в обоих случаях.

Есть также его синхронная версия: fs.readFileSync.

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