我对nodejs,express和javascript很新。 我有一个代码:
router.get('/', function(req, res, next) {
const content = fileReader();
res.render('index', { "content" : content } );
});
fileReader正在使用fs.readFileSync读取for循环中的文件,因此它首先读取所有文件,然后返回一个大字符串。
然后将此字符串传递给view并呈现。
上面的代码工作正常,但当我将其更改为:
router.get('/', function(req, res, next) {
res.render('index', { "content" : fileReader() } );
});
它不起作用。页面已呈现,但内容为空。
fileReader函数:
const fileReader = function()
{
let low = 0;
let high = 9;
let content = "";
for( ; low <= high; low++ )
{
if( fs.existsSync( contentDir + "/" + low ) )
{
content += fs.readFileSync( contentDir + "/" + low, "utf-8" );
}
else
{
break;
}
}
return content;
}
有人能解释一下这里发生了什么吗?为什么在fileReader()完成之前调用render?不应该先执行函数并调用render等待结果?还是并行调用render和fileReader?
请解释。
答案 0 :(得分:0)
在nodeJs中使用同步功能并不是一个好主意,我很确定这就是为什么它在没有内容的情况下呈现你的页面的原因。
你还应该做的是:
const fileReader = function()
{
return new Promise((resolve,reject)=>{
let low = 0;
let high = 9;
let content = "";
for( ; low <= high; low++ )
{
fs.readFile( contentDir + "/" + low, "utf-8",(err,data)=>{
if(err){
reject(err);
}
content += data;
});
}
resolve(content)
});
}
您的文件阅读器以及您的路线的以下内容:
router.get('/', function(req, res, next) {
fileReader().then((data)=>{
res.render('index', { "content" : data } );
}).catch((error)=>{
//handle your error
});
});