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
回答1件
あなたの回答
tips
プレビュー