fs.readdirSync的奇怪行为

Odd behavior of fs.readdirSync

本文关键字:readdirSync fs      更新时间:2023-09-26

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

npm start

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

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

我有一个简单的脚本,它返回视频列表并且它可以工作:

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`));

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

我错过了一些简单的东西吗?

如果我

错了,有人纠正我。

但我相信这是因为res.render还有第三个论点,你看不到这里callback注意到哪个论点。

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

但是

在第二个示例中,您正在传递该选项,但是res.render的回调在readdirSync完成填充之前正在调用。

我想

通了,这实际上是我错过的非常简单的事情。局部变量的名称很重要

在情况 3 中,尽管 show 没有显式传入,但它实际上对使用 swig 呈现的页面可见。

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

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