当动态部分使用承诺时,如何将静态和动态数据包含到express渲染函数中?

问题描述 投票:0回答:1

我正在使用Node和Express制作一个web应用程序,并希望显示来自不同JSON文件的内容。有些包含静态内容,如表格的标题和列标签。有些包含可以动态变化的用户数据。首先,我做了两个不同的函数来读取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()函数目前的样子。

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里面有我的render函数 我被卡住了 如何才能把静态内容也包含进去 我可以把我的 readStaticData('./JSON/staticData1.json'); readStaticData('./JSON/staticData2.json'); 函数来渲染?它们并不直接依赖于动态内容,例如,无论是否有用户数据,标题都应该一直存在。

希望我没有遗漏重要信息,这是我在这里的第一个问题。而且我也是编程新手。如果有人能帮我,先谢谢了!

javascript node.js express
1个回答
1
投票

我会像这样做。你可以只需要一个JSON文件,并将它准备好,因为它是静态的。

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
投票

fs.readFile 总是异步的,所以你可以在这两种情况下使用readData。

也有一个同步的版本。fs.readFileSync.

© www.soinside.com 2019 - 2024. All rights reserved.