質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

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

Node.js

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

JavaScript

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

TypeScript

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

Express

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

Q&A

0回答

392閲覧

NodeJS(TypeScript)+Expressなサーバプログラムの共有データの保存方法について

Yoshinoya

総合スコア6

JSON

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

Node.js

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

JavaScript

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

TypeScript

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

Express

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

0グッド

0クリップ

投稿2018/07/04 17:47

編集2018/07/04 17:50

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問