node.js - 传递数据以在快速车把中查看
问题描述
我正在努力将一些数据发送到我的视图页面。我认为这与代码运行的顺序有关。这是我的代码;
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
变量传递给我的视图文件,可以,加载,无
解决方案
我修改了你的代码,你用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
数组。
推荐阅读
- node.js - 如何在开发模式下针对大量记录优化 MongoDB 查询?
- python - 遍历 pandas 数据框中的特定列和行以执行检查
- javascript - 使用 JQuery 访问嵌套的 CSS 选择器
- python - / 不支持的操作数类型:'Adam' 和 'int
- jquery - 如何使用 JQuery 在导航栏中更改列表项/元素的背景颜色?
- json - 没有从烧瓶路由到 ReactJS 前端的响应
- corda - selection.AbstractCashSelection.unconsumedCashStatesForSpending 时出现不可恢复的检查点错误 - 硬币选择失败
- mongoose - 对具有 id 数组的模型执行单个查询计数?
- docker - 是否可以自定义 swarm 端口?如果是这样,该怎么做?
- ios - 获取非本地化字符串