- 投稿日:2020-08-09T23:07:12+09:00
jestでテスト
jestとは
Node.jsをテストするためのライブラリ
<公式ドキュメント> https://jestjs.io/docs/en/getting-started※Node.jsのテストアプリとしては、他にもmocha(https://mochajs.org/ )が有名。
テストコードが必要な理由
・開発の時間短縮。コードを変更した後でも、テストコマンドを打つだけで自動的にテストしてくれる
・より信頼性の高い(バグの少ない)コーディングができる
・リファクタリングや機能の追加・削除が簡単にできるアプリをテストするための準備
●jestのインストール
npm i jest※npmでのjestのページ ( https://www.npmjs.com/package/jest )
●テスト用の環境を設定する
※本番用の環境がすでに「dev.env」にまとめられている場合・ファイル構成
└── App ├── config //環境を保存するフォルダ | ├── dev.env //本番用環境のための環境変数を格納しているファイル | └── test.env //テスト環境のための環境変数を格納しているファイル・test.envの設定
PORT=3010 MONGODB_URL=mongodb://127.0.0.1:27017/task-manager-api-test※テスト用のデータベースと接続させるようにMongoDBの設定を記述する
●package.jsonの設定
"scripts": { "start": "node src/index.js", "dev": "env-cmd -f ./config/dev.env nodemon src/index.js", "test": "env-cmd -f ./config/test.env jest --watch" //test時に動かす環境を記述。 }, "jest": { "testEnvironment": "node" //jestで nodeのコードをテストすると記述 },※「scripts」に「test」を記述することで、ターミナルに「npm test」でテスト(ファイル名にtestと含まれているもの)を動かすようになる。
※「test」に「--watch」で、「npm test」後に、ターミナルでjestが開きっぱなしになる
expressをテストするためのnpmパッケージ
「super test」 https://www.npmjs.com/package/supertest
・テストコード
const app =require('./app') //portをlistenする以外のアプリの処理を読み込み request(app) .expect(...) //アプリが立ち上がっていなくてもexptectでテストできる→super testパッケージを用いると、アプリが立ち上がっていなくてもテストを行うことができる
通常のテスト
・testのためのファイル構成
└── App ├── test //テストを保存するフォルダ | └── fixture //テスト環境のための環境変数を格納しているファイル | ├── db.js //テスト用データをデータベースに格納するためのファイル | └── async.test.js //テストコードを記述するファイル●通常のテスト
・first.test.jstest('テストケース名',() => { テストしたい関数 }) //正常なら処理完了するテスト test('テストケース名', ()=> { throw new Error ('エラー') //正常ならエラーを返したいテスト項目 })jestでは通常、上記の書き方でテストコードを書く。
「npm test」でテスト開始。ファイル名に「test」が含まれているテストファイルが実行される。非同期処理のテスト
・async.test.js
test('Async test demo', (done) => { //引数にdoneを設定 setTimeout(() => { expect(1).toBe(2) done() //非同期処理(ここではsetTimeout)が終わるタイミングでdoneを呼び出す }, 2000) })↓
今回のテストでは、「setTimeout」をすると「1」が「2」になるかテストしている
↓
2秒後にエラーが返る。※「toBe」について: jest公式ドキュメント
非同期処理のテストは、非同期処理が終わった時点で引数doneを呼び出すように設定しないと、ちゃんとテストされない(非同期処理を待たずにテストをパスしてしまう)
●Promiseを使うコードのテスト
const add = (a, b) => { return new Promise ((resolve, reject) => { setTimeout(() => { if(a < 0 || b < 0){ return reject('Number must be non-negative') } resolve(a + b) }, 2000) }) }上記のコードをテストする場合
・promise.test.jstest('addは機能しているか', (done)=> { add(2, 3).then((sum) => { //thenを使ってチェインさせる expect(sum).toBe(5) done() }) })async/awaitを使ってテストする場合
test('addは機能しているか、async/awaitで', async() => { const sum = await add(11, 22) expect(sum).toBe(33) })テストの前に行う処理・テストの後に行う処理を記述する
「Setup and Teardown」を用いる。
beforeEach(() => {
initializeCityDatabase();
});afterEach(() => {
clearCityDatabase();
});・beforeEach:テストの前に行う処理を記述する
・afterEach:テストの後に行う処理を記述する
例)テストの前に、テスト用データベース内の全ての項目を消す
・users.test.jsconst User = require('../src/models/user') const userOne = { //テストデータ用のデータベースの中身 neme:'aaa', password: '12345' } beforeEach(async() => { //beforeEachは非同期処理 await User.deleteMany() //データベースの中身を削除 await new User(userOne).save() //空になったデータをデータベースに保存 })ライブラリのmockを作成する
・jest公式ドキュメント
Mocking Node Modulesを参照・mockライブラリを作成する場合のファイル構成
└── App ├── test //テストを保存するフォルダ | └── fixture //テスト環境のための環境変数を格納しているファイル | | ├── db.js //テスト用データをデータベースに格納するためのファイル | | └── test.js//テストコードを記述するファイル └── __mocks__ //モックファイルを記述 └── sendgrid //モックを作成するAPI名 └── test.js・test.js
module.exports = { send(){ } }↓
今回はsendgridという、メール送信のためのライブラリ(https://sendgrid.com/docs/api-reference/ )のモックを作成している。コード中に「sgMail.send()」でメール送信をする箇所があった場合、テスト環境では作成したモックのsendgridが実行されるため、「send()」の処理は上記のファイルに書かれた通りのもの(今回の場合は何もしないこと)になる。
- 投稿日:2020-08-09T22:49:46+09:00
Node.jsでmysqlのDate型が勝手にDatetime型で取得される問題を解決する
はじめに
Node.jsドドド初心者です。ローカルで動くDBの情報を表示する簡単なアプリを作成しようと思い立って作ったのですが、思わぬところで落とし穴があったので、それについての覚え書きです。
Node.js Expressで、mysqlを操作している際に発生した事象です。DATE型がDATETIME型として取得されてしまう
今回表示するテーブルは非常にシンプルな情報で構成されていました。
table名 : youtube +----+------------+-----------------------------------------------------------------+ | id | date | title | +----+------------+-----------------------------------------------------------------+ | 1 | 2020-08-08 | 【絶対解けない】答えが「見たことない字」になる合体漢字クイズ | | 2 | 2020-08-07 | 数学の図形を使った共通点当てゲームで爆笑連発!【VENN'S CODE】 | | 3 | 2020-03-27 | 伊沢vs伊沢vs伊沢vs伊沢 | +----+------------+-----------------------------------------------------------------+(中身は、すきなYoutuberさんの動画の情報を拝借しました。)
しかし、実際に情報をNode.jsで表示すると、DATE型のdateカラムが勝手にDATETIME型になってしまう問題が発生しました。
コードは以下の通りです。app.js/*(中略)*/ app.get("/youtube_list",(req,res) =>{ connection.query( 'SELECT * FROM youtube', (error,results) =>{ res.render("youtube_list.ejs",{items: results}); )}; });youtube_list.ejs<% items.forEach((item) => { %> <li> <div class="item-data"> <span class="id-column"><%= item.id %></span> <span class="first-column"><%= item.date %></span> <span class="second-column"><%= item.title %></span> </div> </li> <% }); %>調べた際に、同様の事象が発生している方が何人かいました。JSONの仕様では?という話もあったので、おそらくその影響でしょうか。
シンプルな解決策:connection option
最初は、関数を作ってDATETIME型の情報をこねくり回す方法を取ったのですが、その後改めて調べてみたら、とても単純な話で、「connectionの際にoptionを付与するだけ」でした。
app.jsconst connection = mysql.createConnection({ host:'localhost', user:'root', password:'password', database:'quizknock', dateStrings: 'date' /*または'true'*/ }); connection.connect();このdateStringsで、mysqlから取得するデータを文字列として取得することができます。
知ってしまえばめちゃくちゃ簡単ですね・・・
参考:mysql Git
- 投稿日:2020-08-09T19:01:11+09:00
【Node.js】APIサーバからマイクラ鯖をコントロールしよう #1
はじめに
会員(友人)制のMinecraftの鯖管をやっている筆者であるが、稼働率が高くすぐ負荷に耐えられなくなり、よくサーバの再起動を命ぜられる?
以前はPHPでAPIとWebサイトを簡易的に作り、ログイン式のWebサイトから再起動やバックアップの作成を行えるようにして鯖管をサボっていたわけですが、今回そのAPI部分を
Node.js
+TypeScript
+Express
で新規機能を追加しながら作成してみたいと思います✨このソースコードはGitHubに公開しているので、修正点やアドバイス等があれば是非プルリクをお願いします。またMITライセンスにしておりますので、どうぞご自由にお使いください!
仕様
基本的には以下のことができるAPIサーバを作成する。(予定)
- サーバ稼働状況やバージョンの取得 ← 今回
- オンラインメンバーの一覧取得 ← 今回
- Discordへのエラー通知とDBへのログの保存
- サーバアイコンの取得
- サーバの起動・停止・再起動
- ワールドデータの日常的なGoogleDriveへのバックアップ
プログラムと説明
index.tsimport express from 'express' import { pingAsync, pingOnlineAsync } from "./ping" const app: express.Express = express() const router: express.Router = express.Router() app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*") res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept") next() }) app.use(express.json()) app.use(express.urlencoded({ extended: true })) // --- Get Operational Status -------------------------------------------------- router.get('/api/state', (req: express.Request, res: express.Response) => { pingAsync() .then((json) => { res.send(json) }).catch((err) => { res.send(err) }) }) // ----------------------------------------------------------------------------- // --- Get Online Member ------------------------------------------------------- router.get('/api/state/online', (req: express.Request, res: express.Response) => { pingOnlineAsync() .then((json) => { res.send(json) }).catch((err) => { res.send(err) }) }) // ----------------------------------------------------------------------------- app.use(router) app.listen(3000, () => { console.log('Listening on port 3000...') })ping.tsrequire('dotenv').config() const mc_ping = require('mc-ping-updated') export function pingAsync(): Promise<any> { return new Promise((resolve, reject) => { mc_ping(process.env.SERVER_URL, process.env.SERVER_PORT, function (err: any, res: any) { if (err) reject('stop') else resolve(res) }) }) } export function pingOnlineAsync(): Promise<any> { return new Promise((resolve, reject) => { mc_ping(process.env.SERVER_URL, process.env.SERVER_PORT, function (err: any, res: any) { if (err) reject('stop') else if (res.players.sample) resolve(res.players.sample) else resolve('nobody') }) }) }Minecraftサーバとの通信は、mc-ping-updatedを使用させていただきました。
api/state
にGETメゾットを送ることで このようなフォーマットのJSONを返し、api/state/online
にGETメゾットを送ることで、オンラインメンバーの一覧を取得できます。.envSERVER_URL='example.com' SERVER_PORT=25565
.env
ファイルにまとめてサーバアドレスやポート番号など(随時追加)を記述してあるので、お好みの値に書き換えることで自由にお使えいただけます。次回はサーバの起動・停止・再起動の追加と、その際のDiscordへのエラー通知とDBへのログの保存機能を搭載したいと思います。ぜひご覧ください!
参考
https://qiita.com/notakaos/items/3bbd2293e2ff286d9f49
https://qiita.com/pochopocho13/items/79a4735031ce11a91df7
https://www.npmjs.com/package/mc-ping-updated
https://wiki.vg/Server_List_Ping
- 投稿日:2020-08-09T18:14:50+09:00
Vue.js+Node.js+MongoDBで簡単なクライアントサーバシステムを作ってみた
この記事は株式会社富士通システムズウェブテクノロジーが企画するいのべこ夏休みアドベントカレンダー 2020の10日目の記事です。本記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。
はじめに
Vue.jsとNode.jsを使い、MongoDBに登録された今までに読んだ本の名前をブラウザで確認できるアプリケーションを作りました。
どんな本を読んだか把握しやすくすることで今後の勉強に役立てたいと思います。環境
以下は使用するソフトウェアのバージョンです。
OSはWindows10 Enterprise バージョン1809です。$ node -v v12.16.1 $ npm -v 6.13.4 $ vue -V @vue/cli 4.4.6 $ mongo >db.version() 4.2.8事前準備
- Node.jsとMongoDBのインストールをして、データベースに本のデータを登録します。
Node.jsのインストール
- Node.js公式サイトからNode.jsをダウンロードします。 コマンドプロンプトで以下のコマンドを入力し、バージョン情報が出てきたら問題なくインストールされています。
$ node -v
- Node.jsと一緒にnpmもインストールされるので、以下のコマンドで確認します。
$ npm -vMongoDBのインストール
- 今回はローカル環境でアプリケーションが動くことを確認したいので、まずWindows環境にMongoDBをインストールします。
- MongoDB公式サイトからServerのダウンロードを選択し、ダウンロードしたインストーラーを起動してください。
- Windowsのシステム環境変数Pathに以下のパスを追加します。 ※バージョンによって、4.4の部分は変わります
C:\Program Files\MongoDB\Server\4.4\bin\
- Windowsの再起動後にコマンドプロンプトで以下のコマンドを入力してバージョン情報を確認します。
$ mongo > db.version();データベースの準備
- MongoDB shellでデータベースとコレクションの作成を行います。
$ mongo > use mydb switched to db mydb > db.createCollection('mylist'); { "ok" : 1 } > show collections mylist
- 以下のコマンドでデータベースに読んだ本の名前を登録します。
$ mongo > use mydb switched to db mydb > db.mylist.insert({name:'アジャイルサムライ'}); WriteResult({ "nInserted" : 1 }) > db.mylist.insert({name:'エクストリームプログラミング'}); WriteResult({ "nInserted" : 1 }) > db.mylist.insert({name:'テスト駆動開発'}); WriteResult({ "nInserted" : 1 }) > db.mylist.insert({name:'スクラム現場ガイド'}); WriteResult({ "nInserted" : 1 })クライアントサイドの作成
- 以下のコマンドでクライアントサイドとサーバーサイドをまとめるディレクトリ、クライアントサイドの作業ディレクトリを作成します。 ※質問形式でプロジェクトの作成を行う部分がありますが、Install vue-router?はyesとしてください。
$ mkdir my_project $ cd my_project $ vue init webpack frontend $ cd frontend $ npm run dev
- この状態で
http://localhost:8080
に接続すると、Welcome to Your Vue.js Appと出力された画面を確認できます。サーバーサイドの作成
- 以下のコマンドでサーバーサイドの作業ディレクトリを作成し、必要なモジュールをインストールします。
$ cd my_project $ mkdir backend $ cd backend $ npm init $ npm install --save express body-parser cors mongoose
- 作成されたpackage.jsonのscriptsの部分を以下のように編集します。
package.json{ "name": "backend", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "node index.js" }, "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", "express": "^4.17.1", "mongoose": "^5.9.27" } }APIの作成
- backendにindex.jsを作成し、データベースに登録した本の名前を取得するメソッドを書きます。 ※connectOptionはmongooseでデータベースに接続する際に出る警告を避けるため書いています。
backend/index.jsconst express = require("express"); const bodyParser = require("body-parser"); const cors = require("cors"); const mongoose = require("mongoose"); const BooksList = require("./models/module"); const connectOption = { useNewUrlParser: true, useUnifiedTopology: true, }; mongoose.connect("mongodb://localhost/mydb", connectOption); const app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(cors()); app.get("/mydb", (req, res) => { BooksList.find(function (err, result) { if (!err) { return res.json(result); } else { return res.status(500).send("post mylist faild"); } }); }); app.listen(process.env.PORT || 3000);
- modelsフォルダとmodule.jsを作成し、データベースのスキーマ設定をします。
models/module.jsconst mongoose = require("mongoose"); const Schema = mongoose.Schema; const BooksListSchema = Schema({ name: String }, { collection: "mylist" }); module.exports = mongoose.model("BooksList", BooksListSchema);
- コマンドプロンプトでnpm startとコマンドを入力し、データベースとAPIの確認をします。
$ cd backend $ npm startAPI通信部分と画面の作成
API通信部分の作成
- frontendにaxiosをインストールします。
$ cd frontend $ npm install --save axios
- frontendにapiフォルダを作成します。以下のようにindex.jsとmethods.jsを書き、通信部分を作ります。
api/index.jsimport axios from "axios"; export default () => { return axios.create({ baseURL: `http://localhost:3000/` }); };api/methods.jsimport Api from "./index"; export default { getBooksData() { return Api().get("/mydb"); } };画面の作成
- src/componentsフォルダにBooksList.vueを作成します。デフォルトで作られていたHelloWorld.vueは削除しました。
src/components/BooksList.vue<template> <div class="bookslist"> <h1 class="title">読んだ本リスト</h1> <div class="books"> <li v-for="book in books" :key="book.index">{{book.name}}</li> </div> </div> </template> <script> import Methods from "@/api/methods"; export default { name: "BooksList", data() { return { books: "" }; }, created() { this.getData(); }, methods: { async getData() { let books_data = await Methods.getBooksData(); this.books = books_data.data; }, }, }; </script> <style> .bookslist { max-width: 300px; margin: 0 auto; text-align: center; font-family: Century; } .books { display: inline-block; text-align: left; } .title { color: #5b5b5b; background: linear-gradient(transparent 70%, #6088c6 70%); } </style>
- frontend/router/index.jsに先ほど削除したHelloWorld.vueがコンポーネントとして登録されているので、BooksList.vueに書き換えます。
frontend/router/index.jsimport Vue from "vue"; import Router from "vue-router"; import BooksList from "../components/BooksList"; Vue.use(Router); export default new Router({ routes: [ { path: "/", name: "BooksList", component: BooksList } ] });
- 画面上にデータベースに登録した本の名前が出ているか確認します。
- backendとfrontendでそれぞれ
npm start
とコマンド入力をします。$ cd backend $ npm start$ cd frontend $ npm startさいごに
今回はMongoDBに直接データを入力し、画面上に表示するアプリケーションを作成しました。
今後は画面上からデータを入力できるようにする機能や、本のカテゴリー別の表を作って表示するなどの機能も追加していきたいと思っています。参考
- 投稿日:2020-08-09T16:24:53+09:00
Vue-CLI 3でnpm run serveが失敗するときの解決方法
事象
Dockerコンテナ内の環境にて、
npm run serve
を実行すると、下記のようなエラーが発生していました。ERROR Failed to compile with 2 errors This relative module was not found: * ./src/main.js in multi (webpack)-dev-server/client/index.js (webpack)/hot/dev-server.js ./src/main.js, multi (webpack)/hot/dev-server.js (webpack)-dev-server/client/index.js ./src/main.js環境
- Microsoft Windows 10 Pro
- Docker for Windows
- Visual Studio Code
- node.js : 12.18.2
- npm : 6.14.5
原因
筆者の場合、
npm install
を実行してもpackage.json
内に含まれているdevDependencies
がインストールされておらず、必要なライブラリ(ここでは@vue/cli-service
)が存在していなかったというのが原因でした。解決策
node.js側の環境変数である
NODE_ENV
をdevelopment
(あるいはdev
)にしてからnpm install
を実行する必要がありました。
NODE_ENV
を設定する方法は、①.コマンドラインからexport
する方法と、docker-composeを使っている場合は②.docker-compose.xml
に記載する方法があります。①.
export
コマンドで設定する下記のコマンドで
NODE_ENV
に環境値を設定できます。# NODE_ENVを設定 $ export NODE_ENV=development # 設定した値を確認する $ echo $NODE_ENV development②.
docker-compose.xml
のenvironmentキーに設定するdocker-composeでコンテナを立ち上げている場合、
environment
キーを使って設定することができます。version: '3' services: web: build: . ports: - "8080:8080" environment: - NODE_ENV=development tty: true
export
で設定したときと同様に、$NODE_ENV
をechoすると設定値を確認すると、development
が設定されているのが確認できるはずです。問題の原因を特定するには?
今回の場合、
package.json
に記載されているパッケージが正しくインストールできていると早とちりし、「パスが通っていない」か「windowsでシンボリックリンクが使えないのが悪さしている」と思い込んでいたのが、原因の特定が遅れてしまった原因でした。ちなみに、パッケージが正しくインストールされているかは、
npm list --depth=0
で確認することができます。# インストールされているパッケージの一覧(一階層のみ)を表示 $ npm list --depth=0 project@0.1.0 /app +-- core-js@3.6.5 `-- vue@2.6.11 # core-js と vue しか入ってないやん!もし、筆者と同様に
npm run serve
が正しく動作しない場合は、このコマンドで確認してみるといいかもしれません。
- 投稿日:2020-08-09T15:51:22+09:00
さくっとDenoを試してみる
Denoの特徴
- JavascriptとTypescriptの実行環境
- Typescriptのコンパイラを内包している(tsc-,ts-nodeなど不要)
- 標準ライブラリーは非同期処理にPromiseを採用
- 実行時に必要な権限のオプション指定が必要
- モジュールの扱いがNode.jsと異なる
- etc
環境構築
Docker
こちらのイメージを使用します。
https://hub.docker.com/r/hayd/denoDockerfileFROM hayd/alpine-deno:1.2.2 # Prefer not to run as root. USER deno # Cache the dependencies as a layer (the following two steps are re-run only when deps.ts is modified). # Ideally cache deps.ts will download and compile _all_ external files used in main.ts. COPY deps.ts . RUN deno cache deps.ts # These steps will be re-run upon each file change in your working directory: ADD . . # Compile the main app so that it doesn't need to be compiled each startup/entry. RUN deno cache main.tsdocker-compose.yamlversion: '3' services: app: build: . command: "run --allow-net --allow-read main.ts" ports: - "8000:8000" volumes: - .:/app working_dir: "/app"HelloWorld
main.tsimport { serve } from "./deps.ts"; const PORT =8000; const s = serve(`0.0.0.0:${PORT}`); const body = new TextEncoder().encode("Hello World\n"); console.log(`Server started on port ${PORT}`); for await (const req of s) { req.respond({ body }); }$ docker-compose up -dAPIの作成
Servestを使用
https://github.com/keroxp/servestmain.tsimport { createApp } from "https://servestjs.org/@v1.0.0/mod.ts"; const app = createApp(); app.handle("/", async (req) => { await req.respond({ status: 200, headers: new Headers({ "content-type": "text/plain", }), body: "hello World!", }); }); app.listen({ port:8000 });参考
- 投稿日:2020-08-09T15:38:21+09:00
Node.js の再インストール
Nodeがおかしくなった
$ node Illegal instruction環境
2020-02-13-raspbian-buster-lite
既存の Node.js
「Linux 環境に Node.js インストール」
https://qiita.com/nanbuwks/items/ed8adb2d4324c939a349
の通り、以下のようにインストール1.Linux ディストリビューションの公式パッケージで Node.js と npm を入れる
2.npm install で最新の Node.js を入れる
3.古い Node.js を削除する削除
node のインストール先を調べる
```$ which node
/usr/local/bin/node
```ファイル削除
$ sudo rm -rf /usr/local/bin/node sudo rm -rf ~/.npm削除できたかな?
$ npm /usr/bin/env: ‘node’: No such file or directoryこのあと、先の資料「Linux 環境に Node.js インストール」をもう一度実行して入れ直します。
- 投稿日:2020-08-09T15:21:23+09:00
Linux 環境に Node.js インストール
いろんな Linux 環境に Node.js をインストールした記録
方針
「Ubuntuに最新のNode.jsを難なくインストールする」
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
を参考に、以下の方法を採ることにした。
- Linux ディストリビューションの公式パッケージで Node.js と npm を入れる
- npm install で最新の Node.js を入れる
- 古い Node.js を削除する
検証環境
- Ubuntu14.04 (2020/07に実行)
- Ubuntu18.04 (2020/08に実行)
- 2020-02-13-raspbian-buster-lite (2020/07に実行)
Linux ディストリビューションの公式パッケージで Node.js と npm を入れる
$ sudo apt update $ sudo apt install nodejs npm $ sudo node -vここで、 RaspberryPi だと v10.21.0
Ubuntu18.04 だとv8.10.0 だった。npm install で最新の Node.js を入れる
$ sudo npm install n -gUbuntu14.04 でのエラーと対処
ここで Ubuntu14.04 でエラーが出た。
npm http GET https://registry.npmjs.org/n npm http GET https://registry.npmjs.org/n npm http GET https://registry.npmjs.org/n npm ERR! Error: CERT_UNTRUSTED npm ERR! at SecurePair.<anonymous> (tls.js:1370:32) npm ERR! at SecurePair.EventEmitter.emit (events.js:92:17) npm ERR! at SecurePair.maybeInitFinished (tls.js:982:10) . . .「npm install で SSL Error になった時の対処法。」
https://blog.yug1224.com/archives/563d9b67bf652a600632d01e/を参考にして、SSL鍵のバリデーションを一旦OFFしたらうまくいった。
# sudo npm config set strict-ssl false # sudo npm install n -gその後設定を元に戻す。
# sudo npm config set strict-ssl true古い Node.js を削除する
node をインストールした後、aptでインストールしたものを削除、ログオン。
$ sudo n stable $ sudo apt purge -y nodejs npm $ exec $SHELL -lバージョン確認。
$ node -v v12.18.2実行してみる。
WebSocketを使ったものをテスト実行するために、モジュールをインストール
# npm install -g ws実行
# node index.jsUbuntu14.04では以下のようにエラーが出た
Error: Cannot find module 'ws' Require stack:「Node.jsで、存在するはずのmoduleがrequireでエラーになることについて」
https://qiita.com/DNA1980/items/11fdb7233fc288ac3502を読んで、
echo $NOTE_PATHで設定されていなかったので以下のように実行すればエラー解消した
export NODE_PATH=`npm root -g`
- 投稿日:2020-08-09T13:28:40+09:00
Mac セットアップ(2)
コマンドラインインストール
brew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"途中でXCodeのインストール確認があるのでEnterを押す
Node
nodebrewでバージョンを管理したい
brew install nodebrew
途中経過
Updating Homebrew... ==> Auto-updated Homebrew! Updated 1 tap (homebrew/core). ==> New Formulae osm ==> Updated Formulae Updated 10 formulae. ==> Downloading https://github.com/hokaccha/nodebrew/archive/v1.0.1.tar.gz ==> Downloading from https://codeload.github.com/hokaccha/nodebrew/tar.gz/v1.0.1 ######################################################################## 100.0% ==> Caveats You need to manually run setup_dirs to create directories required by nodebrew: /usr/local/opt/nodebrew/bin/nodebrew setup_dirs Add path: export PATH=$HOME/.nodebrew/current/bin:$PATH To use Homebrew's directories rather than ~/.nodebrew add to your profile: export NODEBREW_ROOT=/usr/local/var/nodebrew Bash completion has been installed to: /usr/local/etc/bash_completion.d zsh completions have been installed to: /usr/local/share/zsh/site-functions ==> Summary ? /usr/local/Cellar/nodebrew/1.0.1: 8 files, 38.6KB, built in 2 secondsインストールできたか確認
nodebrew -v
(成功した場合の)結果
nodebrew 1.0.1 Usage: nodebrew help Show this message nodebrew install <version> Download and install <version> (from binary) nodebrew compile <version> Download and install <version> (from source) nodebrew install-binary <version> Alias of `install` (For backword compatibility) nodebrew uninstall <version> Uninstall <version> nodebrew use <version> Use <version> nodebrew list List installed versions nodebrew ls Alias for `list` nodebrew ls-remote List remote versions nodebrew ls-all List remote and installed versions nodebrew alias <key> <value> Set alias nodebrew unalias <key> Remove alias nodebrew clean <version> | all Remove source file nodebrew selfupdate Update nodebrew nodebrew migrate-package <version> Install global NPM packages contained in <version> to current version nodebrew exec <version> -- <command> Execute <command> using specified <version> Example: # install nodebrew install v8.9.4 # use a specific version number nodebrew use v8.9.4zshにパスを追加
vi ~/.zsh_profile以下を追加
export PATH=$HOME/.nodebrew/current/bin:$PATHセットアップをしてnodebrewのインストールを完了する
nodebrew setup結果
Fetching nodebrew... Installed nodebrew in $HOME/.nodebrew ======================================== Export a path to nodebrew: export PATH=$HOME/.nodebrew/current/bin:$PATH ========================================Node v10.xをインストール
v10.22.0が最新なので以下のコマンドでインストールする
nodebrew install-binary v10.22.0結果
Fetching: https://nodejs.org/dist/v10.22.0/node-v10.22.0-darwin-x64.tar.gz ############################################################################################################################################################################################### 100.0% Installed successfully rouc@roucnombp ~ %
インストールできたか確認
nodebrew ls
結果
v10.22.0 current: noneスイッチする
nodebrew use v10.22.0スイッチされたか確認
nodebrew ls
結果
v10.22.0 current: v10.22.0 ## <<<--- 現在どのバージョンが使われているかが表示されている