首页 > 解决方案 > 传递数据以在快速车把中查看

问题描述

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

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

所以文件读取功能正在发生并获得正确的值但是传递到视图模板的值仍然是“开始消息”

我无法弄清楚如何以正确的顺序获取它,以便我可以将fileMessage变量传递给我的视图文件,可以,加载,无

标签: node.jsexpresshandlebars.js

解决方案


我修改了你的代码,你用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

(我通常不建议这样做,因为它会阻塞事件循环)

那么正确的语法是

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

然后你可以迭代fileNames数组。


推荐阅读