前提・実現したいこと
NodeJS(TypeScript)+Expressを使ってサーバプログラムの開発を行っております。
アクセスユーザ単位でなく、アクセスカウンタ等、サーバプログラム起動中のみ共有したいデータは
どのように保持するのがベストプラクティスなのでしょうか?
現在候補として
1.何らかのデータベースに保持する。
2.グローバル変数に保持する。
という2案を考えています。
まず1については、インメモリDBであるNeDBを使ったプログラム(routes/index.tsおよびmodules/DataStore.ts)
を組んでリクエストで送られてきた情報を保存することに成功しました。
ただこの場合、このNeDBをポイントするクラス変数(と言っていいのか微妙ですが)である
"export let neDBStore:Datastore"を含むindex.tsのスタック領域がカベージコレクトされてしまうと、
データが消えてしまうと考えています。
ASP.NETでいうところのGlobal.aspx的?、サーバプログラム全体で共有可能な永続的保存領域がNodeJSの
サーバサイドプログラムにはあるのでしょうか?
次に2については、そもそもTypeScriptでGlobal変数をどのように記述すればよいのかわかりません。
Declare修飾子というキーワードの情報があったので使ってみましたが下記のようなエラーが発生し期待した
プログラム起動中共有データ領域としてグローバル領域を使うこともかないませんでした。
どのようなソリューションがあるかお教えください。
該当のソースコード
Typescript
1//routes/index.ts 2import express = require('express'); 3import { DataStore } from '../modules/DataStore'; 4 5const router = express.Router(); 6export let neDBStore: DataStore; 7 8router.put('/', (req: express.Request, res: express.Response) => { 9 console.log(req.body); 10 neDBStore = new DataStore(); 11 neDBStore.storeDB(req.body); 12 res.send("request param:" + req.body); 13});
TypeScript
1//modules/DataStore.ts 2import * as fs from 'fs'; 3import * as NeDB from 'nedb'; 4 5export class DataStore { 6 private tmpDB: NeDB; 7 constructor() { 8 this.tmpDB = new NeDB(); 9 } 10 11 storeDB(items: Array<Object>): void { 12 let item; 13 let docs; 14 for (item in items) { 15 docs = [{ id: item[0], name: item[1], tel: item[2] }]; 16 this.tmpDB.insert(docs); 17 } 18 } 19}
Typescript
1import express = require('express'); 2const router = express.Router(); 3export declare namespace glib { 4 var count: number; 5}; 6router.get('/', (req: express.Request, res: express.Response) => { 7 glib.count = 1; 8 res.render('index', { title: 'Express' }); 9}); 10 11export default router;
コード3の実行時エラー内容
glib is not defined
ReferenceError: glib is not defined
at C:\Users\user\source\repos\ExpressRESTAPI\ExpressRESTAPI\routes\index.js:10:5
at Layer.handle [as handle_request] (C:\Users\user\source\repos\ExpressRESTAPI\ExpressRESTAPI\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\user\source\repos\ExpressRESTAPI\ExpressRESTAPI\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\user\source\repos\ExpressRESTAPI\ExpressRESTAPI\node_modules\express\lib\router\route.js:112:3)
補足情報(FW/ツールのバージョンなど)
NodeJS 8.9+
TypeScript 2.8+
Express 4.15
あなたの回答
tips
プレビュー