node.js エラー「SyntaxError: Cannot use import statement outside a module」が発生した場合の対処法

node.js エラー「SyntaxError: Cannot use import statement outside a module」が発生した場合の対処法

node.jsで、エラー「SyntaxError: Cannot use import statement outside a module」が発生した場合の対処法を記述してます。

環境

  • OS windows 10 pro
  • node 14.6.0

エラー全文

以下のコードで発生

import { createClient } from 'redis';

エラー全文

(node:11660) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
redis.js:1
import { createClient } from 'redis';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1152:16)
    at Module._compile (internal/modules/cjs/loader.js:1200:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1257:10)
    at Module.load (internal/modules/cjs/loader.js:1085:32)
    at Function.Module._load (internal/modules/cjs/loader.js:950:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47

対処法

エラーメッセージにあるように、package.jsonに「”type”: “module”」を追加。

set "type": "module" in the package.json

「package.json」

{
  "name": "hoge",
  "version": "1.0.0",
  "description": "",
  "main": "redis.js",
  "type": "module",
  "dependencies": {
    "redis": "^4.0.2"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

自分の場合は、以上で解決しました。

※「redis」を使用すると別のエラーが発生します。これも書いてある通り、

import { createClient } from 'redis';
         ^^^^^^^^^^^^
SyntaxError: The requested module 'redis' is expected to be of type CommonJS, which does not support named exports. CommonJS modules can be imported by importing the default export.
For example:
import pkg from 'redis';
const { createClient } = pkg;
    at ModuleJob._instantiate (internal/modules/esm/module_job.js:98:21)
    at async ModuleJob.run (internal/modules/esm/module_job.js:137:5)
    at async Loader.import (internal/modules/esm/loader.js:162:24)
    at async Object.loadESM (internal/process/esm_loader.js:68:5)

コードを以下のように変更すれば解決しました。

import pkg from 'redis';
const { createClient } = pkg;