传递数据以在 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
数组。
我正在努力将一些数据发送到我的查看页面。我认为这与代码 运行 的顺序有关。这是我的代码;
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
数组。