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

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

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

Yarnは、Facebook/Exponent/Google/Tildeが開発したJavaScriptのパッケージマネージャ。npmよりもインストールが速く、厳密にモジュールのバージョンを固定できるなど、npmの問題を解決。npmと互換性があり、同じpackage.jsonを使用できます。

Node.js

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

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

TypeScript

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

Q&A

解決済

1回答

2265閲覧

TypeScriptを用いたyarn redisでのredis-severの起動ができない

torotabetaai

総合スコア5

Yarn

Yarnは、Facebook/Exponent/Google/Tildeが開発したJavaScriptのパッケージマネージャ。npmよりもインストールが速く、厳密にモジュールのバージョンを固定できるなど、npmの問題を解決。npmと互換性があり、同じpackage.jsonを使用できます。

Node.js

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

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

TypeScript

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

0グッド

0クリップ

投稿2020/08/29 09:59

編集2020/08/29 18:31

TypeScript上でnode_moduleの中のredis-serverを呼び出しRedisサーバーを起動したい

こんにちは。現在「実践TypeScript 吉井健文著」という書籍でTypeScriptを学習しているものです。
その書籍の第9章9-2-2にsessionの保持に、Node.jsのRedisサーバーであるredis-serverを使う。TypeScript上でredis-serverというmoduleをimportしてnpm scriptに記載した「yarn redis」を実行すると、Redisサーバーが6379番ポートで起動するという記述があり試しているのですが,公式のサンプルコードを実行しても下記のようなエラーがでてしまい、Redisサーバーが起動しません。

エラーメッセージ

yamashitajunichinoMacBook-Pro:ts-express-session-master yamajon$ yarn redis yarn run v1.22.4 yarn run v1.22.4 $ ts-node-dev src/redis/index.ts ts-node-dev ver. 1.0.0-pre.61 (using ts-node ver. 8.10.2, typescript ver. 3.9.7) Error: spawn redis-server ENOENT at Process.ChildProcess._handle.onexit (internal/child_process.js:268:19) at onErrorNT (internal/child_process.js:468:16) at processTicksAndRejections (internal/process/task_queues.js:80:21) [ERROR] 01:48:55 Error: spawn redis-server ENOENT

redis-serverをimportするのはこのTSプログラムです
src/redis/index.ts

TypeScript

1//src/redis/index.ts 2//@ts-ignore 3import RedisServer from 'redis-server'; 4import { REDIS_HOST, REDIS_PORT } from '../constants' 5 6const server = new RedisServer( 7 REDIS_PORT 8 ) 9 10server.open((err: any) => { 11 if (err === null) { 12 console.log(`Running on http://${REDIS_HOST}:${REDIS_PORT}`) 13 } else { 14 console.log(err) 15 } 16})

書籍によるとredis-serverはTypeScript向けの型定義が提供されておらず、DefinitelyTypedにも型定義はない(2019年6月時点)ので@ts-ignoreを付与することでTypeScriptのコンパイルチェックをスキップしているそうです
上記プログラムでimportしているconstants.tsです
src/constants.ts

TypeScript

1//src/constants.ts 2export const APP_HOST = 'localhost' 3export const REDIS_HOST = 'localhost' 4export const APP_PORT = 3000 5export const REDIS_PORT = 6379

使用しているpackage.jsonです

//package.json { "name": "ts-express-session", "version": "1.0.0", "author": "takepepe", "private": true, "scripts": { "serve": "ts-node-dev src/server/index.ts", "redis": "ts-node-dev src/redis/index.ts", "prettier": "prettier './src/**/*.ts' --write" }, "dependencies": { "axios": "^0.18.0", "body-parser": "^1.18.3", "connect-redis": "^3.4.1", "cookie-parser": "^1.4.4", "ejs": "^2.6.1", "express": "^4.16.4", "express-session": "^1.16.0", "http-errors": "^1.7.2", "redis-server": "^1.2.2" }, "devDependencies": { "@types/axios": "^0.14.0", "@types/connect-redis": "^0.0.9", "@types/cookie-parser": "^1.4.1", "@types/express": "^4.16.1", "@types/express-session": "^1.15.12", "@types/http-errors": "^1.6.1", "@types/webpack-env": "^1.13.9", "prettier": "^1.16.4", "ts-loader": "^5.3.3", "ts-node-dev": "^1.0.0-pre.32", "typescript": "^3.4.3", "webpack": "^4.29.6", "webpack-dev-middleware": "^3.6.2", "webpack-hot-middleware": "^2.24.3" } }

プロジェクト構成は以下のとおりです

|_package.json
|_src
| |____redis
| |   |_index.ts
| |
| |_constant.ts

|_node_modeles
| |  
| |_redis-server

|_tsconfig.json
|_yarn.lock
|_webpack.config.js

試したこと

まずは公式リファレンスをみてみました。
https://www.npmjs.com/package/redis-server
するとindex.ts内のnew RedisServer()にpathを記述すればよいと書いてあったのでindex.tsを以下のように修正しました

//@ts-ignore import RedisServer from 'redis-server'; // import promisequeue from '/usr/local/bin/promise-queue'; import { REDIS_HOST, REDIS_PORT } from '../constants' const server = new RedisServer( { port: 6379,    bin: '/node_modules/redis-server'   } ) server.open((err: any) => { if (err === null) { console.log(`Running on http://${REDIS_HOST}:${REDIS_PORT}`) } else { console.log(err) } })

しかしエラーは変わりませんでした。

yamashitajunichinoMacBook-Pro:ts-express-session-master yamajon$ yarn redis yarn run v1.22.4 $ ts-node-dev src/redis/index.ts ts-node-dev ver. 1.0.0-pre.61 (using ts-node ver. 8.10.2, typescript ver. 3.9.7) Error: spawn /node_modules/redis-server ENOENT at Process.ChildProcess._handle.onexit (internal/child_process.js:268:19) at onErrorNT (internal/child_process.js:468:16) at processTicksAndRejections (internal/process/task_queues.js:80:21) [ERROR] 18:36:09 Error: spawn /node_modules/redis-server ENOENT

なのでリファレンスを読み返すとPATHの指定のしかたが間違っていたようなので、index.tsを以下のように改善しました

//@ts-ignore import RedisServer from 'redis-server'; import { REDIS_HOST, REDIS_PORT } from '../constants' const server = new RedisServer( { port: 6379, //bin: '/node_modules/redis-server' bin: '/usr/local/bin/redis-servers' } ) server.open((err: any) => { if (err === null) { console.log(`Running on http://${REDIS_HOST}:${REDIS_PORT}`) } else { console.log(err) } })
//src/redis/index.ts yamashitajunichinoMacBook-Pro:ts-express-session-master yamajon$ yarn redis yarn run v1.22.4 $ ts-node-dev src/redis/index.ts ts-node-dev ver. 1.0.0-pre.61 (using ts-node ver. 8.10.2, typescript ver. 3.9.7) Error: spawn /usr/local/bin/redis-servers EACCES at Process.ChildProcess._handle.onexit (internal/child_process.js:268:19) at onErrorNT (internal/child_process.js:468:16) at processTicksAndRejections (internal/process/task_queues.js:80:21) [ERROR] 17:02:14 Error: spawn /usr/local/bin/redis-servers EACCES

しかしエラーの種類が変わっただけでサーバーは起動しません。EACCESについて調べてみたのですが権限がないことが原因のようだったので以下のサイトを参考に権限を与えられないか試してみました。
https://qiita.com/Gaddict/items/8c76d92bd0adec2bfb6a

export PATH=$PATH:redis-servers

を実行したあとに

sudo chmod 777 /usr/local/lib/redis-servers

を実行したのですがなにも変わりませんでした。

公式リファレンスや以下のようなサイトをみたところ
https://github.com/BrandonZacharie/node-redis-server/issues/6
https://github.com/BrandonZacharie/node-redis-server/issues/2
やはりpathの指定の方法に問題があるようですが、自分の今の力ではサーバーを起動することができないので、よろしければpathの指定の仕方などの問題を解決していただけないでしょうか。trratailを使うのが初めてなので至らない部分があるかと存じますが、どうかよろしくお願いします。

補足情報(FW/ツールのバージョンなど)

ソースコードは著者の方がGitHubで公開しているものを使わせてもらいました
https://github.com/takefumi-yoshii/ts-express-session

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

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

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

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

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

torotabetaai

2020/09/01 07:49

ご指摘ありがとうございます。別にredisサーバーをインストールしてみたところうまく行きました。
guest

回答1

0

ベストアンサー

同様の状況で解決しました。
こちらの環境はmacです。
当初、/usr/local/bin/redis-server

は存在しない状況でしたが

brew install redis
を実行で

/usr/local/bin/redis-server

が作られ、その後
yarn redis
が正常に動作します。

'redis-server'はredisをnode.jsから操作するためのライブラリでredis本体がないから怒られているってことなんでしょうね。

文法に関しましては書籍のものでも公式のものでも動きます。

投稿2020/09/02 13:48

nkn-ms

総合スコア13

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

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

torotabetaai

2020/09/03 06:28

回答ありがとうございます。ご指摘いただいた方法を試してみたところうまく起動することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問