- 投稿日:2020-02-04T15:36:53+09:00
Docker 環境で nodemon が watch してくれない問題と対処方法
Web アプリの開発環境を Docker で作っていたところ、nodemon がうまくファイル変更を検出してくれなくて困ったので、そのときのメモ。
マウントしたボリュームだと nodemon が watch してくれない問題
問題を再現するために、以下の3つのファイルを用意する。
ポイントとしては、ホストのディレクトリをコンテナ内にマウントしてそれをコンテナ内の nodemon が watch しているということ。
DockerfileFROM node:12 ADD . /app WORKDIR /app CMD ["node", "."]index.jsconst http = require('http') http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }) res.end('ok') }).listen(80)docker-compose.ymlversion: '3' services: app: build: . ports: - 8080:80 volumes: - .:/app command: npx nodemon
docker-compose upでコンテナを起動し、Web ブラウザからhttp://localhost:8080/にアクセスするとokと表示されるはず。この開発用コンテナは nodemon から node プロセスを起動しているので、
index.jsが編集された場合には自動で restart してほしい。しかしこの場合、いくら
index.jsを編集しても nodemon はその変更を検出してくれない。Chokidar が Polling するように設定する
nodemon はファイル監視のために内部で Chokidar を利用しており、そのドキュメントにはこのように書いてある。
usePolling (default: false). Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU utilization, consider setting this to false. It is typically necessary to set this to true to successfully watch files over a network, and it may be necessary to successfully watch files in other non-standard situations. Setting to true explicitly on MacOS overrides the useFsEvents default. You may also set the CHOKIDAR_USEPOLLING env variable to true (1) or false (0) in order to override this option.
ネットワーク経由でファイルを監視する場合にはポーリングするように設定する必要があるらしい。
docker-compose.yml+ environment: + CHOKIDAR_USEPOLLING: 1というわけで環境変数
CHOKIDAR_USEPOLLING=1を設定した上で再試行したところ、無事にファイル変更を検出してくれるようになった。めでたしめでたし。
- 投稿日:2020-02-04T13:37:09+09:00
UbuntuでNode.jsとExpressの環境を作る
Ubuntu で Node.js と Express の環境を作って試してみる
Ubuntu の環境は既に作成済なのが前提
Node.js を動かす環境を作る
- 参考サイト→https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
- とりあえず最新のを入れようとしてみる
下記を順番に入力したら完了
sudo apt install -y nodejs npm sudo npm install n -g sudo n stable sudo apt purge -y nodejs npm exec $SHELL -lversionを確認するなら↓コレ
node -vv12.14.1 とか出るはず
Node.js で Hello World してみる
node と入力して node を起動
↓こんなのが出るWelcome to Node.js v12.14.1. Type ".help" for more information. >以下を入力
console.log('Hello world')出力を確認
Hello world undefinedCTRL+Cを2回押すとvagrantターミナルに戻る
express を動かす環境を作る
フォルダ作成
mkdir (フォルダ名)cd (フォルダ名) でフォルダ移動しとこう
- Package.jsonを作る
npm init色々質問されるけど、最初は全部Enter押下でも良い
必要に応じて記入する
- express をインストール
以下を実行
npm install express --saveこれでようやく express が使える
express に hello world させる
先ほど作ったフォルダに移動
cd (フォルダ名)
- app.js を作る
- nano と入力してテキストエディタを起動 (他のテキストエディタが良いならそれでも可)
↓コレを入力(orコピペ)して、 app.js として保存
app.jsconst express = require('express') const app = express() app.get('/', (req, res) => res.send('Hello World!')) app.listen(3000, () => console.log('Example app listening on port 3000!'))
- node app.js を起動
コンソールには↓こんなのが出る
Example app listening on port 3000!GUIのUbuntu-Desktopがあれば、
ブラウザで http://localhost:3000/ にアクセスすると、
Hello World! がブラウザに表示される。IPの設定は以前書いたやつのVagrantfileで設定してたはずなので、
そのままだったら、 http://192.168.123.222:3000/ にアクセスしたら、
Hello World! がブラウザに表示される。これで完了。
あとは MySQL との接続&表示とかをしていけばいい。
参考
- Ubuntu に Node.js を入れる
- Ubuntu に express を入れる
- express で hello world してみる
- 投稿日:2020-02-04T13:21:14+09:00
react-native のMetro bundlerでNodeエラーが出るときの対処
概要
React Native開発をしているとMetro Bundlerが上がってきます。
このときに自動で立ち上がってくるTerminal上のMetroでエラーが出た時の対処方法のメモとなります。対象読者
- React Native v0.59.x >= 利用者
事象
React Native開発をしていると(古いバージョンでは)必ずMetro Bundlerのお世話になります。Metro Bundlerは
react-native-cliのrun-iosコマンドを叩くなどすると上がってきます。その際、新規PCで何気なく実行すると下記のエラーが出ました。
あれ?nodeがない?となりましたが、普段使いしているterminalで確認したところ下記の通り、nodeは入っていました。
$ node -v v10.17.0原因
NVMなどを使っていると、参照しているnodeはホームディレクトリ配下のことが多いです。
しかし、react-native run-iosで起動するターミナルが参照するNodeのPATHは/usr/local/bin/nodeのようです。よって、自身が利用しているnodeのパスを確認して、
/usr/local/bin/nodeへリンクを通してあげると解決します。# nodeが存在することを確認できます $ which node /home/USERNAME/.nvm/versions/node/v10.17.0/bin/node # 上記パスに対して、シンボリックリンクをはります # $()とすることで()内コマンドの結果を利用できます $ ln -s $(which node) /usr/local/bin/node参考リンク
- 投稿日:2020-02-04T10:37:32+09:00
ubuntu18.04でnpm testを使いava実行すると「SyntaxError: Unexpected token {」エラーが出てしまうときの解決方法
なんてことないことでしたがNode.js, npm, avaを使い初めて日も浅くて2~3時間悩んだのでメモです。あまりいないかもしれないですが、他に同現象で困っている人がいたら役立ちますように。
現象
初めてavaを使おうと https://www.npmjs.com/package/ava に従ってnpm testをすると以下のエラーとなってしまい実行できない。
$ npm test > ava -v (node:5301) UnhandledPromiseRejectionWarning: /home/shohei/tmp/20200203/shoheihagiwara-cli/node_modules/ava/lib/node-arguments.js:9 } catch { ^ SyntaxError: Unexpected token { at createScript (vm.js:80:10) at Object.runInThisContext (vm.js:139:10) at Module._compile (module.js:616:28) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3) at Module.require (module.js:596:17) at require (internal/module.js:11:18) at Object.exports.run (/home/shohei/tmp/20200203/shoheihagiwara-cli/node_modules/ava/lib/cli.js:261:33) (node:5301) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:5301) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.環境
$ uname -v #30~18.04.1-Ubuntu SMP Fri Jan 17 06:14:09 UTC 2020 $ node --version v8.10.0 $ npm --version 3.5.2 $ grep ava package.json -C1 "scripts": { "test": "ava -v" }, -- "dependencies": { "ava": "^3.2.0" } $ cat test.js const test = require('ava'); test('foo', t => { t.pass(); }); test('bar', async t => { const bar = Promise.resolve('bar'); t.is(await bar, 'bar'); });原因
ava 3 で Node.js v8 はサポートが切れているためです。(https://github.com/avajs/ava/releases)
他にもava のページには「avaがサポートするのはNode.jsがサポートするもののみ」と書かれていて、2020年2月時点で Node.js v8 自体がNode.jsでサポート切れになっています。(https://github.com/nodejs/Release#release-schedule)
解決方法
ava 3 がサポートする Node.js をインストールし実行し直します。
自分は v12 をインストールしました。
参照:https://github.com/nodesource/distributions/blob/master/README.md#installation-instructions# インストール $ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - $ sudo apt-get install -y nodejs # バージョン確認 $ node --version v12.14.1 # 実行 $ npm test > ava -v ? foo ? bar 2 tests passed
- 投稿日:2020-02-04T00:41:12+09:00
JavascriptのDate.prototype.toString()系まとめ
new Date()からタイムスタンプを作ってファイル名にしたい時、どのフォーマットにするか毎回調べてるのでまとめる
メソッド 出力される文字列 備考 new Date('2000-01-01 00:00:00').toString() "Sat Jan 01 2000 00:00:00 GMT+0900 (日本標準時)" new Date('2000-01-01 00:00:00').toISOString() "1999-12-31T15:00:00.000Z" new Date('2000-01-01 00:00:00').toLocaleString() "2000/1/1 0:00:00" new Date('2000-01-01 00:00:00').toGMTString() "Fri, 31 Dec 1999 15:00:00 GMT" 非推奨 .toUTCString()を使う new Date('2000-01-01 00:00:00').toUTCString() "Fri, 31 Dec 1999 15:00:00 GMT" new Date('2000-01-01 00:00:00').toDateString() "Sat Jan 01 2000" new Date('2000-01-01 00:00:00').toLocaleDateString() "2000/1/1" new Date('2000-01-01 00:00:00').toTimeString() "00:00:00 GMT+0900 (日本標準時)" new Date('2000-01-01 00:00:00').toLocaleTimeString() "0:00:00" おまけ
moment.jsでお手軽にタイムスタンプを作りたいとき(よくやる)// const moment = require('moment'); import moment from 'moment'; const now = moment().format('YYYY-MM-DD HH:mm:ss.SSS'); now; // 2000-01-01 00:00:00.000hourを00~23で表したいときは、大文字でHH
小文字でhhだと1~12になってしまう
