Javascript 在参数求值之前调用express render
我对nodejs、express和javascript非常陌生。 我有一个密码:Javascript 在参数求值之前调用express render,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我对nodejs、express和javascript非常陌生。 我有一个密码: router.get('/', function(req, res, next) { const content = fileReader(); res.render('index', { "content" : content } ); }); fileReader正在使用fs.readFileSync读取for循环中的文件,因此它首先读取所有文件,然后返回一个大字符串 然后将该字符串传递给
router.get('/', function(req, res, next) {
const content = fileReader();
res.render('index', { "content" : content } );
});
fileReader正在使用fs.readFileSync读取for循环中的文件,因此它首先读取所有文件,然后返回一个大字符串
然后将该字符串传递给视图并进行渲染
上面的代码工作正常,但当我将其更改为以下内容时:
router.get('/', function(req, res, next) {
res.render('index', { "content" : 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;
}
const fileReader=function()
{
设low=0;
设高=9;
让内容=”;
对于(;low,在nodeJs中使用sync函数不是一个好主意,我很确定这就是为什么它会呈现没有内容的页面
您还应该做的是:
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)
});
}
你能发布fileReader()的代码吗“这两个例子都是相同的。你是舒尔公司吗?第一个例子产生的是真正的结果吗?”拉夫科德补充道fileReader@Jonasw它当前读取3个包含内容的文件并正确发送,我可以在浏览器中看到内容,但对于第二个代码段,我无法确定两者是否相等。错误在其他地方,请查看控制台…如果fs.readFile是asy然后,在填充内容之前不会调用nc解析?或者先执行并完成解析之前的代码?或者承诺返回对内容的引用,因为您这样做了。然后使用空内容调用解析,但在读取文件时填充内容?这是否保证了文件添加到内容的顺序新台币?或者(可能)是随机的?谢谢你的回答,但请你再详细说明一下。很抱歉,这个迟来的回答,我正在寻找一个更好的解决方案,刚刚发现:如果你一直滚动到“承诺”第章你可以找到解决问题的方法。过程很简单,他用promise包装fs.stat函数,然后用promise.all()
解决所有问题。你也可以用fs.readFile()
代替fs.stat()
谢谢,我对它做了更多的尝试,实际上也想到了这一点,但我不会拒绝任何文件上的承诺,而是始终解决,区别在于价值。如果我正确理解第一个拒绝,停止处理其余承诺,因此如果第一个文件不存在,我将永远不会阅读其余承诺。因此我有一系列承诺s并等待所有这些,使用NaN值解决错误,然后过滤结果数组并仅使用fs read中的数据,然后将其作为新数组发送到视图,这样也可以保证顺序。
router.get('/', function(req, res, next) {
fileReader().then((data)=>{
res.render('index', { "content" : data } );
}).catch((error)=>{
//handle your error
});
});