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')});
我使用 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')});