« ^ »

Node.js+ExpressでAPIを実装する

所要時間: 約 2分

環境構築

Node.js + Expressの構成でサーバープロセスが起動するように環境を構築する。 なおNode.jsは既にインストール済みとする。

まずは初期化する。

npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (1645543138)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /opt/ng/symdon/pages/posts/1645543138/package.json:

{
  "name": "1645543138",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes) yes

Expressをインストールする。

npm install --save express

ファイルを作成する

src/app.js

Expressのエントリーポイントを記述したファイルを作成する。

const express = require('express')
const { getName } = require('./foo')
const GetRequestHeaders = require('./GetRequestHeaders')
const app = express()
const port = 3000

app.use('/request-headers', GetRequestHeaders)

app.get('/', (req, res) => {
  res.send(getName())
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

src/foo.js

app.js以外のモジュールも追加しておきたいのでfoo.jsを作っておく。

const getName = () => { 
  return 'testing';
};

exports.getName = getName;

その他のファイル

src/GetRequestHeaders.js を以降の項目で作成している。

実行

nodeコマンドを使って起動する。

node src/app.js
node src/foo.js

プロセスが起動すると3000のTCPポートを待ち受ける。

Example app listening on port 3000

ブラウザでアクセスするとこのような文字列が表示される。

https://res.cloudinary.com/symdon/image/upload/v1645601863/blog.symdon.info/1645543138/hello_zgpnw5.png

Debuggerで処理を停止しステップ実行する

node inspect コマンドを用いてデバッガを起動できる。

node inspect src/app.js
(node:50878) ExperimentalWarning: AbortController is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
< Debugger listening on ws://127.0.0.1:9229/7dd75c98-e2b1-4fdc-a2e0-185f631efdf8
< For help, see: https://nodejs.org/en/docs/inspector
<
< Debugger attached.
<
 ok
Break on start in src/app.js:1
> 1 const express = require('express')
  2 const { getName } = require('./foo')
  3
debug> c
< Example app listening on port 3000
<

ファイルパスと行番号を指定してbreakpointを設定する。

debug> sb("/opt/ng/symdon/pages/posts/1645543138/src/foo.js", 2)
  1 const getName = () => {
> 2   return 'testing';
  3 };
  4
  5 exports.getName = getName;
  6
  7
debug>

ブラウザでアクセスすると、このbreakpointで停止した状態で入力待ちとなる。

break in src/foo.js:2
  1 const getName = () => {
> 2   return 'testing';
  3 };
  4
debug> n
break in src/foo.js:2
  1 const getName = () => {
> 2   return 'testing';
  3 };
  4
debug> c
debug>

HTTPリクエストヘッダーを取得する

リクエストヘッダーにはリクエストオブジェクトのheaders属性でアクセスできる。 ここではUser-Agentを取得し、レスポンスでそれを応答する例を示す。

プロセスを再起動しリクエストを送信する。 リクエストのUser-AgentにはEmacsを指定した。

GET http://localhost:3000/request-headers
User-Agent: Emacs
Your user agent is "Emacs".
// GET http://localhost:3000/request-headers
// HTTP/1.1 200 OK
// X-Powered-By: Express
// Date: Sat, 26 Feb 2022 23:45:38 GMT
// Connection: keep-alive
// Keep-Alive: timeout=5
// Content-Length: 27
// Request duration: 0.010399s

User-Agentの値を取得し、期待通りにレスポンスにUser-Agentの値を返していることが確認できた。