fs.readdirSync 的奇怪行为

Odd behavior of fs.readdirSync

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

npm start

而在package.json中定义为:

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

我有这个简单的脚本 returns 一个视频列表并且它有效:

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;

但我观察到一些有趣的事情......如果我进行以下修改,它不再有效,并且 returns 一个空列表:

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

为了让它更有趣,以下作品:

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

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

我是不是漏掉了一些简单的东西?

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

但我相信这是因为 res.render 有第三个你看不到的参数是 callback noted here

因此,当您在第一个示例中创建变量时,您会阻塞直到获得变量,然后使用 运行 时间可用的变量渲染模板。

但是在你的第二个例子中,你传递了那个选项,但是 res.render 的回调在 readdirSync 完成填充之前调用。

我想通了,实际上我错过了一些非常简单的事情。 local 变量的名称是 significant.

情况3,虽然没有显式传入shows,但是对于使用swig渲染的页面来说,确实是可见的。

如果我不想引入变量显示,我可以执行以下操作并且有效:

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