0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Node.js】バージョンが古くてfetchが使えんのお

Last updated at Posted at 2022-01-03

はじまり

Node.jsのための環境を以下の記事のように立ち上げました。

そして、そのまま、fetchを使ったスクリプトが動くかどうかを試してみたのですが、
何か自分のスクリプトとは違うエラー(Unexpected Identifierみたいな)が出現しました。

そこで調べてみてこんな記事を見つけました。

そこには、importを使うスクリプトの拡張子は.mjsでなければならないと書いてあったのですが、
fetchはメジャーなモジュールなので、流石にそんなヤバい挙動を2年も引き摺っていないだろうと思いました。
恐らく、Node.jsのバージョンを上げれば直るだろうと思い、この記事を書きました。

今回、立ち上げた環境は、ubuntuです。

問題のやつ

これが出てきたエラー画面です。
20220103_01.jpg

「SyntaxError: Unexpected Identifier」が出てきてから色々調べましたが、上述の記事くらいしか良さげなものが見つかりませんでした。fetchモジュールのファイルの中でエラー起きるとかマジですか。。。
なので、原因というものは見つかりませんでしたが、
このときに使用していたNode.jsのバージョンが「10.19.0」であり、2020-02-05にリリースされたものでした。
2022-01-03時点で、推奨版が「16.13.1」なのでバージョンアップすれば直るのではと思いました。

モジュールのバージョンアップ

モジュールをバージョンアップする処理もDockerfileに加えました。

Dockerfile(バージョンアップしないバージョン)
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install nodejs -y
RUN apt-get install npm -y
RUN update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10

ADD package.json .
ADD index.js .
CMD npm run start
Dockerfile(バージョンアップするバージョン)
FROM ubuntu:latest
RUN apt-get update

# for install n
RUN apt install -y curl

# install old nodejs and npm
RUN apt-get install nodejs -y
RUN apt-get install npm -y

# for version up nodejs
RUN npm install -g n
RUN n 16.13.1

# uninstall old nodejs and npm
RUN apt-get purge nodejs npm -y

# for version up npm
RUN npm install -g npm
RUN npm update -g

# to avoid "npm ERR! Tracker "idealTree" already exists"
WORKDIR /usr/app
COPY ./ /usr/app

# module etc...
RUN npm install node-fetch --save

# not need "update-alternatives" if "n" package manager
# RUN update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10

# to get files from local
ADD package.json .
ADD index.mjs .
ADD README.md .
# CMD npm run start

これで仮想マシンをBuildしたら動くのかと思いきや、またエラーが出てきてしまいました。

index.js
import fetch from 'node-fetch';

どうやら、.mjsを使わないとimportできない問題は顕在中のようです。

しょうがないので拡張子を変えたら、ES6で動いていたスクリプトがやっと動きました!
fetchが動きました! 時間掛かった~!

index.mjs
import fetch from 'node-fetch';

fetchモジュールの方は、mjsファイルにする方ではなく、package.jsonに"type": "module"を追加することで、index.jsの状態でも使えるようにしてるみたいです。

おしまい

  • すんごい困ったら新しいバージョンにしてみる。
  • 新しいバージョンの方がエラーメッセージも分かりやすい。
  • importしたファイルは.mjsファイルにする。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?