传递数据以在 express handlebar 中查看

Pass data to view in express handlebar

我正在努力将一些数据发送到我的查看页面。我认为这与代码 运行 的顺序有关。这是我的代码;

exports.home = (req, res) => {
  let fileMessage = 'starting message';
  const fileSys = 'public/data/';
  const fileArray = [];
  fs.readdirSync(fileSys, (err, files) => {
    if (err) console.log(err);
    else {
      files.forEach((file) => {
        if (path.extname(file) === '.csv') {
          fileArray.push(file);
        }
      });
      if (fileArray.length === 1) {
        fileMessage = 'OK';
        console.log(fileMessage);
      }
      if (fileArray.length > 1) {
        fileMessage = 'loads';
        console.log(fileMessage);
      }
      if (fileArray.length === 0) {
        fileMessage = 'none';
        console.log(fileMessage);
      }
    }
  });
  console.log('before render');
  res.render('index', {
    title: 'Admin',
    fileMessage,
    home: true
  });
  console.log('after render');
};

在这种格式下,我得到以下输出;

before render
after render

显然文件读取没有发生。

如果我更改为 readdir() 我得到;

before render
after render
none

因此文件读取功能正在发生并获得正确的值,但是传递到视图模板中的值仍然是 'starting message'

我不知道如何以正确的顺序获取它,以便我可以将 fileMessage 变量传递到我的视图文件,好的,加载,none

我已经修改了您的代码,您使用 readdirSync 的方式有误。如果你想使用回调,那么只使用 readdir ,而且由于操作是异步的,你会得到浏览器中呈现的 fileMessage 的初始值(数据甚至在文件读取完成),所以你应该像我下面做的那样在 callBack function 中将响应发送回浏览器。

exports.home = (req, res) => {
        let fileMessage = 'starting message';
        const fileSys = 'public/data/';
        const fileArray = [];
        fs.readdir(fileSys, (err, files) => {
          if (err) console.log(err);
          else {
              console.log(files);
            files.forEach((file) => {
              if (path.extname(file) === '.csv') {
                fileArray.push(file);
              }
            });
            if (fileArray.length === 1) {
              fileMessage = 'OK';
              console.log(fileMessage);
            }
            if (fileArray.length > 1) {
              fileMessage = 'loads';
              console.log(fileMessage);
            }
            if (fileArray.length === 0) {
              fileMessage = 'none';
              console.log(fileMessage);
            }
          }
          console.log('before render');
      res.send(fileMessage)
        console.log('after render');
        });
        
      }

如果您打算使用 readirSync

(Which I typically won't suggest doing because it will block the event loop)

那么正确的语法是

const fs = require('fs'); 
  
// Function to get current filenames 
// in directory 
filenames = fs.readdirSync("public/data);

然后你可以迭代fileNames数组。