奇怪的行为fs.readdirSync

我使用nodejs 5.5.0和nodejs 1.0.1。 我运行脚本:

 npm start 

在package.json中,它被定义为:

 "scripts": { "start": "pm2 start bin/www --watch" }, 

我有这个简单的脚本,返回一个video列表,它的工作原理:

 var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { const fs = require('fs'); shows = fs.readdirSync(`public/videos`); res.render('index', shows); }); module.exports = router; 

但是我观察到一些有趣的东西…如果我进行下面的修改,它不再起作用,并返回一个空列表:

 //shows = fs.readdirSync(`public/videos`); res.render('index', fs.readdirSync(`public/videos`)); 

为了使它更有趣,下面的工作:

 shows = fs.readdirSync(`public/videos`); res.render('index', fs.readdirSync(`public/videos`)); 

在我看来,如果有某种延迟或caching,fs.readdirSync可以正常工作,但是如果在同一行上直接调用,则不会。

我错过了简单的事情吗?

有人纠正我,如果我错了..

但我相信这是因为res.render有第三个参数,你不会看到这里指出的是callback

所以当你在第一个例子中创build这个variables的时候,你会阻塞,直到你得到这个variables,然后在运行时使用可用的variables来渲染这个模板。

但在第二个示例中,您正在传递该选项,但在readdirSync可以完成填充之前readdirSync的callback正在调用。

我想清楚了,这实际上是错过了一些非常简单的事情。 局部variables的名称是重要的

在情况3中,尽pipe显示没有被显式传入,但是实际上对于使用swig呈现的页面是可见的。

如果我不想介绍variables显示,我可以完成以下工作:

 res.render('index', {shows: fs.readdirSync('public/videos')});