20200204のNode.jsに関する記事は5件です。

Docker 環境で nodemon が watch してくれない問題と対処方法

Web アプリの開発環境を Docker で作っていたところ、nodemon がうまくファイル変更を検出してくれなくて困ったので、そのときのメモ。

マウントしたボリュームだと nodemon が watch してくれない問題

問題を再現するために、以下の3つのファイルを用意する。

ポイントとしては、ホストのディレクトリをコンテナ内にマウントしてそれをコンテナ内の nodemon が watch しているということ。

Dockerfile
FROM node:12

ADD . /app
WORKDIR /app

CMD ["node", "."]
index.js
const http = require('http')

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' })
  res.end('ok')
}).listen(80)
docker-compose.yml
version: '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 を設定した上で再試行したところ、無事にファイル変更を検出してくれるようになった。

めでたしめでたし。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UbuntuでNode.jsとExpressの環境を作る

Ubuntu で Node.js と Express の環境を作って試してみる

Ubuntu の環境は既に作成済なのが前提

Node.js を動かす環境を作る

下記を順番に入力したら完了

sudo apt install -y nodejs npm
sudo npm install n -g
sudo n stable
sudo apt purge -y nodejs npm
exec $SHELL -l

versionを確認するなら↓コレ

node -v

v12.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
 undefined

CTRL+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.js
const 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 との接続&表示とかをしていけばいい。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

react-native のMetro bundlerでNodeエラーが出るときの対処

概要

React Native開発をしているとMetro Bundlerが上がってきます。
このときに自動で立ち上がってくるTerminal上のMetroでエラーが出た時の対処方法のメモとなります。

対象読者

  • React Native v0.59.x >= 利用者

事象

React Native開発をしていると(古いバージョンでは)必ずMetro Bundlerのお世話になります。Metro Bundlerは react-native-clirun-iosコマンドを叩くなどすると上がってきます。

その際、新規PCで何気なく実行すると下記のエラーが出ました。
Screenshot 2020-02-04 13.05.58.png

あれ?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

参考リンク

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.000

hourを00~23で表したいときは、大文字でHH
小文字でhhだと1~12になってしまう

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む