Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在参数求值之前调用express render_Javascript_Node.js_Express_Asynchronous - Fatal编程技术网

Javascript 在参数求值之前调用express render

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循环中的文件,因此它首先读取所有文件,然后返回一个大字符串 然后将该字符串传递给

我对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) {
    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
     }); 
 });