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;
...
});