82246


<https://stackoverflow.com/questions/18112204/get-all-directories-within-
directory-nodejs>

と

[特定ディレクトリ配下のファイルのみ(またはディレクトリのみ)を取得（Node.js v10.10以降版) -
Qiita](https://qiita.com/takeyuichi/items/65477e9c8ff5cfc6fdef)

と

<https://stackoverflow.com/a/43622386/1979953>

を参考に下記のコードを書きました（コードはほとんどQiitaの記事のままです）。

[code]

    const dirPath = "./pages/";
    const allDirents = fs.readdirSync(dirPath, { withFileTypes: true });
    const fileNames = allDirents.filter(dirent => dirent.isFile()).map(({ name }) => name);
    console.log(fileNames)
    
[/code]

インポート文を

[code]

    import { promises as fs } from "fs"
    
[/code]

とすると、

[code]

    const allDirents = fs.readdirSync(dirPath, { withFileTypes: true });
                          ^
    
    TypeError: fs.readdirSync is not a function
    
[/code]

というエラーがでます。

[code]

    import * as fs from 'fs';
    
[/code]

とすると、エラーはなくなり、コードは正常に動きます。

現在コードを改良しており、既存コードは `await` を使っているので、

[code]

    import { promises as fs } from "fs"
    
[/code]

で書きたいのですが、不可能なのでしょうか？ そもそもなぜこのようなエラーが出ているのでしょうか？

また

[code]

    import {fs} from 'fs';
    
[/code]

とした場合は

[code]

    import {fs} from 'fs';
            ^^
    SyntaxError: The requested module 'fs' does not provide an export named 'fs'
    
[/code]

というエラーです。

> Or in case the module has named exports:  
>  import {fs} from 'fs';

とあったので、いけそうな気がしたのですが無理だったようです。

[code]

    import { promises as fs } from "fs"
    
[/code]

とした場合はインポート自体は成功しているので、このような違いがでる理由がわかりません。

実行環境：

上記コード自体は拡張子を `.mjs` にしており、

package.json の scripts は下記のようにしています

[code]

      "scripts": {
        "render": "node --es-module-specifier-resolution=node render.mjs",
    
[/code]

起動方法：

[code]

    npm run render
    
[/code]

## まとめ

まとめると下記になります

  * `import * as fs from 'fs';` だと成功
  * `import {fs} from 'fs';`と`import { promises as fs } from "fs;"` がエラーになる理由が知りたい（しかもそれぞれエラー内容が違う）
  * 理想は既存コードに上記コードを足したいので `import { promises as fs } from "fs;"` が使いたい


CC BY-SA 4.0
2021-09-05T02:52:05.043
82243
2021-09-05T05:17:41.433
2021-09-05T04:12:06.003
9008
9008
question
javascript node.js
fs.readdirSync is not a function というエラーがでる


javascript のモジュールは、以下を export します。

  * default の何かしら
  * 名前が付いた何かしら

`import * as fs from 'fs';` とは、「名前が付いた export をすべて import し、それらを `fs.名前`
でアクセスできるようにしろ」という構文です。

`import {fs} from 'fs';` とは、「`fs` の名前が付いた何かしらを `fs` の名前でアクセスできるようにしろ」という構文です。

`import { promises as fs } from "fs;"` とは、「`promises` の名前がついた何かしらを `fs`
の名前でアクセスできるようにしろ」という構文です。

それぞれやっていることが違うので、動作は当然に違ってきます。

* * *

やりたいことが、「`promises`の名前で export されたものを `fs` でアクセスしながら `readdirSync`
も使いたい」ということでしたら、

`import { promises as fs, readdirSync } from 'fs';` を実行しながら、 `readdirSync`
は直接(`fs.`のプレフィックスをつけずに)利用するといけるような気がしています。


CC BY-SA 4.0
2021-09-05T05:17:41.433
82246
2021-09-05T05:17:41.433
754
82243
answer