Typescript + Expressの設定方法
インストール
ExpressとTypescript関係のモジュールのインストールについて。 最初にExpressをインストールします。
npm install express
次に、Typescriptと、Expressの型宣言をインストールします。
npm install --save-dev typescript @types/express
開発環境用の設定
開発環境では、修正するたびに手動でTypescriptをコンパイルしたり、再起動したりするのは大変なので、 それらの手間を省いてくれる ts-node-dev をインストールします。
npm install --save-dev ts-node ts-node-dev
Expressサーバー起動用ソースが、src/app.ts の場合、package.json の scriptsに以下を追加します。
{ "scripts": { "server": "ts-node-dev src/app.ts" }, ... }これで、以下を実行すると、Typescriptで書かれた src/app.ts をコンパイルして実行してくれます。
npm run server
正常に動作すれば、http://[IPアドレス]:3000/ でアクセスできます。
簡単な起動用サンプル
ここでは、ソースファイルを src/app.ts としています。 これは、全てのリクエストに対して、HTTPステータスコードが200で、"test express" という文字列を返します。
import express from 'express'; import { Express, Response, Request } from 'express'; const app: Express = express(); app.get('/*', (req: Request, res: Response) => { res.status(200).send('test express'); }); const port = 3000 console.log(`Running Express. port: ${port}`); app.listen(port);ブラウザがGETでアクセスしてきたときの処理は、app.get('/*', ...) になります。 ここでは、'/*' と指定していて、全てのGETアクセスを処理するようにしています。 通常は、URLのパスごとに、処理を指定することになります。
この例では、ポート3000で動作するようにしているので、 ブラウザで http://[IPアドレス]:3000 にアクセスして、”test express" と表示されたら正常に動作しています。
注意 Expressは、POSTデータ処理用の設定を行わないとPOSTデータ受信ができないので、この例もGETでしかデータを受け取れません。
セッションやPOST用の設定を含んだサンプル
セッションやPOST用の設定を含んだサンプルのAppServerクラスを使った起動用app.tsを以下のようにします。
import { AppServer } from './AppServer'; const server = new AppServer(); server.init(); server.start();
AppServerクラスは以下のようになります。 セッション処理とPOSTデータ受信用の設定があります。
import * as express from 'express'; import { Express, Response, Request } from 'express'; import * as session from 'express-session'; export interface MySession extends session.SessionData { counter?: number; } export class AppServer { private app: Express; private port: number = 3000; public init() { const app = express(); // POST用設定。 app.use(express.json()); app.use(express.urlencoded({ extended: true })); // セッション設定 this.setSession(app); // ルーティング設定 this.setRoute(app); this.app = app; } public start() { console.log(`Running Express. port: ${this.port}`); this.app.listen(this.port); } private setSession(app: Express) { const hour = app.use(session({ secret: 'my-test-key', resave: false, saveUninitialized: true, cookie: { maxAge: 60 * 60 * 1000 // ミリ秒 } })); } private setRoute(app: Express) { app.get('/', (req: Request, res: Response) => { this.checkSession(req.session); res.status(200).send(` <html> <body> <h1>Post test</h1> <form action="/post" method="post"> name: <input type="text" name="name" /><br /> comment: <input type="text" name="comment" /><br /> <input type="submit" value="send" /> </form> </body> </html> `) }); app.post('/post', (req: Request, res: Response) => { const comment: string = req.body.comment; const name: string = req.body.name; const sessId: string = req.sessionID; console.log('sessionId: %O', sessId); this.checkSession(req.session); res.status(200).send(` <html> <body> <p>name: ${name}</p> <p>comment: ${comment}</p> <a href="/">return</a> </body> </html> `) }); // 先に登録したURL以外を処理 app.get('/*', (req: Request, res: Response) => { res.status(200).send('test express'); }); return app; } private checkSession(session: MySession) { if (session) { console.log('session: %O', session); } else { console.log('session is empty.'); } if (!session.counter) { session.counter = 1; } else { session.counter += 1; } } }
セッション
Expressでセッションを使用する場合、ミドルウェアexpress-sessionを使うことができます。 インストールする場合は、以下を実行します。
npm install express-sessionまた、Typescirpt用に@types/express-sessionもインストールします。
npm install --save-dev @types/express-session
セッション初期化は、専用メソッドを用意していて、以下になります。
private setSession(app: Express) { const hour = app.use(session({ secret: 'my-test-key', resave: false, saveUninitialized: true, cookie: { maxAge: 60 * 60 * 1000 // ミリ秒 } })); }ここでは、session.cookie.maxAge でセッションの有効期間(単位ミリ秒)を指定しています。 この例では、60 * 60 * 1000 ミリ秒(60分)を指定しています。
POST用設定
Expressは、POST用設定を行わないと、POSTによるデータ受け渡しができません。 POSTを許可するためには、ミドルウェアbody-parserをインストールして設定するか、v4.17.0 以降に使えるようになった express.jsonの設定が必要となります。
このサンプルでは、express.jsonをつかって、以下のように設定しています。
const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: true }));
POSTデータの取得は、以下のようになります。
app.post('/post', (req: Request, res: Response) => { const comment: string = req.body.comment; const name: string = req.body.name; ... });