質問編集履歴

2 誤字

Yoshinoya

Yoshinoya score 2

2018/07/05 02:50  投稿

NodeJS(TypeScript)+Expressなサーバプログラムの共有データの保存方法について
### 前提・実現したいこと
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の
サーバサイドプログラムにはあるのでしょうか?
Declare修飾子というキーワードの情報があったので使ってみましたが下記のようなエラーが発生し期待した
プログラム起動中共有データ領域としてグローバル領域を使うこともかないませんでした。
どのようなソリューションがあるかお教えください。
### 該当のソースコード
```Typescript
//routes/index.ts
import express = require('express');
import { DataStore } from '../modules/DataStore';
const router = express.Router();
export let neDBStore: DataStore;
router.put('/', (req: express.Request, res: express.Response) => {
   console.log(req.body);
   neDBStore = new DataStore();
   neDBStore.storeDB(req.body);
   res.send("request param:" + req.body);
});
```
```TypeScript
//modules/DataStore.ts
import * as fs from 'fs';
import * as NeDB from 'nedb';
export class DataStore {
   private tmpDB: NeDB;
   constructor() {
       this.tmpDB = new NeDB();
   }
   storeDB(items: Array<Object>): void {
       let item;
       let docs;
       for (item in items) {
           docs = [{ id: item[0], name: item[1], tel: item[2] }];
           this.tmpDB.insert(docs);
       }
   }
}
```
```Typescript
import express = require('express');
const router = express.Router();
export declare namespace glib {
   var count: number;
};
router.get('/', (req: express.Request, res: express.Response) => {
   glib.count = 1;
   res.render('index', { title: 'Express' });
});
export 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
  • JavaScript

    19922 questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • JSON

    1426 questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Node.js

    2302 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • TypeScript

    474 questions

    TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

  • Express

    298 questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

1 誤字

Yoshinoya

Yoshinoya score 2

2018/07/05 02:48  投稿

NodeJS(TypeScript)+Expressなサーバプログラムの共有データの保存方法について
__イタリックテキスト__### 前提・実現したいこと
### 前提・実現したいこと
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の
サーバサイドプログラムにはあるのでしょうか?
次に1については、そもそもTypeScriptでどのように記述すればよいのかわかりません。
Declare修飾子というキーワードの情報があったので使ってみましたが下記のようなエラーが発生し期待した
プログラム起動中共有データ領域としてグローバル領域を使うこともかないませんでした。
どのようなソリューションがあるかお教えください。
### 該当のソースコード
```Typescript
//routes/index.ts
import express = require('express');
import { DataStore } from '../modules/DataStore';
const router = express.Router();
export let neDBStore: DataStore;
router.put('/', (req: express.Request, res: express.Response) => {
   console.log(req.body);
   neDBStore = new DataStore();
   neDBStore.storeDB(req.body);
   res.send("request param:" + req.body);
});
```
```TypeScript
//modules/DataStore.ts
import * as fs from 'fs';
import * as NeDB from 'nedb';
export class DataStore {
   private tmpDB: NeDB;
   constructor() {
       this.tmpDB = new NeDB();
   }
   storeDB(items: Array<Object>): void {
       let item;
       let docs;
       for (item in items) {
           docs = [{ id: item[0], name: item[1], tel: item[2] }];
           this.tmpDB.insert(docs);
       }
   }
}
```
```Typescript
import express = require('express');
const router = express.Router();
export declare namespace glib {
   var count: number;
};
router.get('/', (req: express.Request, res: express.Response) => {
   glib.count = 1;
   res.render('index', { title: 'Express' });
});
export 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
  • JavaScript

    19922 questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • JSON

    1426 questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Node.js

    2302 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • TypeScript

    474 questions

    TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

  • Express

    298 questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る