Node.js – コマンドライン引数(パラメータ)について

引数の数

const argc = process.argv.length;

引数へのアクセス

1つ目の引数はインデックス2に格納される

console.log(process.argv[2]);

argv0

コマンドで実行されたときのnode.exeの値がそのまま入るようです。
何を言っているのか分かりにくいので、以下の例を見てください。

index.js

console.log("process.argv0   = " + process.argv0);
console.log("process.argv[0] = " + process.argv[0]);

実行と結果

>node index.js
process.argv0   = node
process.argv[0] = C:\Program Files\nodejs\node.exe

>node.exe index.js
process.argv0   = node.exe
process.argv[0] = C:\Program Files\nodejs\node.exe

>"C:\Program Files\nodejs\node.exe" index.js
process.argv0   = C:\Program Files\nodejs\node.exe
process.argv[0] = C:\Program Files\nodejs\node.exe

参考資料

ワンライナーでWebサーバ

はじめに

ちょっとしたプログラムの動作確認で、Webサーバを起動したいときってありますよね。
そんな時、私はワンライナーで実行できるWebサーバを利用しています。


  • 環境:Windows10
  • 公開したいディレクトリに移動し、以下のコマンドを実行します。

Node.js

npx http-server -p 8080

参考資料
https://www.npmjs.com/package/http-serve

Golang

  • goexecインストール

    go get -u github.com/shurcooL/goexec
  • webサーバ実行

    goexec http.ListenAndServe(\":8080\",http.FileServer(http.Dir(\".\")))

参考資料
https://github.com/golang/go/wiki/WebAssembly

Python 3.x

python -m http.server 8081

参考資料
https://docs.python.org/ja/3/library/http.server.html

PHP

php -S localhost:8081

参考資料
https://www.php.net/manual/ja/features.commandline.webserver.php

Electron – アプリ環境構築のひな型

はじめに

Electronのアプリ環境構築のひな型です。
環境はWindows10です。

前提

Node.jsがインストール済みであること。

アプリ構築手順

プロジェクトを作成しElectronインストール

mkdir <プロジェクトフォルダ>
cd <プロジェクトフォルダ>
npm init -y
npm install --save-dev electron

アプリ作成

プロジェクトフォルダ直下に index.js という名前のファイルを作成

"use strict";

// Electronのモジュール
const electron = require("electron");

// アプリケーションをコントロールするモジュール
const app = electron.app;

// ウィンドウを作成するモジュール
const BrowserWindow = electron.BrowserWindow;

// メインウィンドウはGCされないようにグローバル宣言
let mainWindow;

// 全てのウィンドウが閉じたら終了
app.on('window-all-closed', function() {
  if (process.platform != 'darwin') {
    app.quit();
  }
});

// Electronの初期化完了後に実行
app.on('ready', function() {
  // メイン画面の表示
  mainWindow = new BrowserWindow({width: 800, height: 600});
  mainWindow.loadURL('file://' + __dirname + '/index.html');

  // ウィンドウが閉じられたらアプリも終了
  mainWindow.on('closed', function() {
    mainWindow = null;
  });
});

プロジェクトフォルダ直下に index.html というファイルを作成

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Sample</title>
</head>
<body>
  <p>Hello World</p>
</body>
</html>

動作確認

cd <プロジェクトフォルダ>
npx electron .

コンパイル

electron-packagerインストール

npm install --save-dev electron-packager

EXEファイル作成

--electronVersionpackage.json から判定するので不要

cd <プロジェクトフォルダ>
node_modules\.bin\electron-packager . <アプリ名> --platform=win32 --arch=x64

EXE実行

cd <アプリ名>-win32-x64
<アプリ名>.exe

Node.js+Express.js – 画像やJavaScriptなど静的ファイルにアクセスする方法

初めてExpress.jsで作成したこのアプリで、Expressのejsファイルからjsなど静的ファイルへのアクセス方法ではまったので、備忘録として記録しておきます。

以下のような構成を元に説明します。

sampleprj
├index.js
│
├─public
│  └─js
│  └samplejs.js
│
└─views
  └view1.ejs

publicフォルダを静的ファイルのフォルダとして設定

/* index.js */
const express = require("express");
const app = express();

const PORT = 8081;
const server = app.listen(PORT, function(){
  console.log(`Server listening on port ${PORT}...`);
});

app.set('view engine', 'ejs');
app.use(express.static('public')); // ここでpublicフォルダを指定
app.get("/view1", function(req, res, next) {
    res.render("view1", {});
});

ejsファイルからjsファイルを読み込む

<!-- view1.ejs -->
<head>
  <script src="/js/samplejs.js"></script>
</head>

public フォルダ内に、例えば sampleimg.jpg という画像ファイルが格納されている場合、ブラウザで以下のURLにアクセスすると、その画像ファイルが表示されます。

http://xxx.xxx.xxx.xxx:8081/sampleimg.jpg

nginxの配下でnodejsやgolangを動かす方法

nodejsやgolangは自分自身がWebサーバの機能も持ち合わせています。

それはそれで便利なのですが、それらのプログラムがフロントに立ってしまうと複数のプログラムを実行する場合は、その分ポートを開ける必要があります。

また、それが外部に公開するサービスだとしたら、443以外のポートにリクエストを送らなければならない仕様となり、利用者も扱いにくいです。

そのため、フロントに別のWebサーバを立てる必要があるかと思います。

mainserver.com
mainserver.com
https://mainserver.com/gosample
→http/port:8081へ転送
https://mainserver.com/gosample…
https://mainserver.com/nodesample
→http/port:8082へ転送
https://mainserver.com/nodesample…
Viewer does not support full SVG 1.1

上記のような構成でのnginx最小限の設定は以下の通りです。

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name mainserver.com;

    location /gosample/ {
        proxy_pass http://127.0.0.1:8081/;
    }

    location /nodesample/ {
        proxy_pass http://127.0.0.1:8082/;
    }
}