๊ฐ๋ฐ ์ค์ธ Express ์๋ฒ๋ฅผ ๋ค์ ์์ํ๊ธฐ ์ํด Nodemon์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํ๋ก์ธ์ค ์ข
๋ฃ ์ server.close()
์ ๋ฆฌ๋ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ํ ๋ "ํฌํธ 3000์ด ์ด๋ฏธ ์ฌ์ฉ ์ค์
๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ์์ฃผ ํ์๋์ด nodemon์ด ์ด์ ์์ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ์ง ๋ชปํ๊ณ ์ฌ์ ํ ๋ถ๋ฆฌ๋ ํ๋ก์ธ์ค๋ก ์คํ ์ค์์ ๋ํ๋
๋๋ค. nodemon์ ์ฃฝ์ด๊ณ killall node
์คํํ๊ณ nodemon์ ๋ค์ ์์ํด์ผ ํฉ๋๋ค. ์๋ ค์ง ๋ฌธ์ ์
๋๊น? ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด์ํ๊ฒ๋ ์ฌ๊ธฐ์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ๋๋ ์ ์ ์ด๊ฒ์ ๊ฒฝํํ ์ ์ด ์์๊ณ , ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ๊ธฐ ์ํด ๋ฌด์์ ์ ๋ฐ์ดํธํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
OS X ์ ์บํผํ
๋
ธ๋ v6.9.1
๋
ธ๋๋ชฌ v1.11.0
์ฌ๊ธฐ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ต์คํ๋ ์ค ์๋ฒ์์๋ EADDRINUSE ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
OS X ์์๋ผ
๋
ธ๋ v6.10.3
๋
ธ๋๋ชฌ v1.11.0
31960 ttys005 0:00.41 node /Users/harman.goei/.nvm/versions/node/v7.10.0/bin/nodemon -e ts --verbose --exec ts-node lib/server.ts
31962 ttys005 0:00.10 node /Users/harman.goei/.nvm/versions/node/v7.10.0/bin/ts-node lib/server.ts
31963 ttys005 0:01.10 /Users/harman.goei/.nvm/versions/node/v7.10.0/bin/node /Users/harman.goei/.nvm/versions/node/v7.10.0/lib/node_modules/ts-node/d
ist/_bin.js lib/server.ts
nodemon์ 31962๋ฅผ ์์ฑํ์ง๋ง 31963์ ์ฌ์ ํ โโ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค(31963์ 31962์ ์์ ํ๋ก์ธ์ค๋ผ๊ณ ์๊ฐํฉ๋๋ค). ๊ทธ๋ฐ ๋ค์ ๋ค์ ์์ํ ๋ 31963์ด ์ฌ์ ํ ์๋ฒ๋ฅผ ์คํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์
๋ฐ์ดํธ:
๊ฒ์ํ๋ฉด SIGUSR2๊ฐ ์์ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. SIGHUP์ด ํ์ํ์ต๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์์ง ํด๊ฒฐ์ฑ ์ ์ฐพ์ ์ฌ๋์ด ์์ต๋๊น?
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๊ณ ์๋ฌด๋ฐ์๋ ํ์ด ๋์ค๋ ๊ฒ ๊ฐ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ด ํญ๋ชฉ js ํ์ผ์ ๋งจ ์๋์ ์ถ๊ฐํ๊ธฐ ์์ํ์ฌ ์ด๊ฒ์ด ๋ด ์คํฌ๋ฆฝํธ์ ๋ง์ง๋ง์ผ๋ก ์คํ๋ ํ์ด ๋๋๋ก ํ๊ณ , ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
CTRL+C์ OSX Sierra 10.12.5๋ฅผ ์คํํ๋ Mac์์ iTerm์ nodemon ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํฉ๋๋ค.
process.on('SIGINT', () => {
console.log("Bye bye!");
process.exit();
});
๊ฐ์ ๋ฌธ์ ์
๋๋ค. CTRL+C๋ฅผ ํด์ ํ๊ณ npm start
๋ค์ ์คํํด๋ ๊ด์ฐฎ์ต๋๋ค.
$ npm start
> [email protected] start ter
> npm run build:live
> [email protected] build:live ter
> nodemon --exec ./node_modules/.bin/ts-node -- ./index.ts
[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `./node_modules/.bin/ts-node ./index.ts`
NodeJS server started...
[nodemon] restarting due to changes...
[nodemon] starting `./node_modules/.bin/ts-node ./index.ts`
[nodemon] restarting due to changes...
[nodemon] starting `./node_modules/.bin/ts-node ./index.ts`
NodeJS server started...
NodeJS server started...
Error: listen EADDRINUSE :::3000
at Object.exports._errnoException (util.js:1016:11)
at exports._exceptionWithHostPort (util.js:1039:20)
at Server.setupListenHandle [as _listen2] (net.js:1307:14)
at listenInCluster (net.js:1355:12)
at Server.listen (net.js:1455:7)
at Application.listen (/ter/node_modules/koa/lib/application.js:64:19)
at Object.<anonymous> (/er/index.ts:9:5)
at Module._compile (module.js:569:30)
at Module.m._compile (ter/node_modules/ts-node/src/index.ts:379:23)
at Module._extensions..js (module.js:580:10)
[nodemon] app crashed - waiting for file changes before starting...
^C
$ npm start
> [email protected] start ter
> npm run build:live
> [email protected] build:live ter
> nodemon --exec ./node_modules/.bin/ts-node -- ./index.ts
[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `./node_modules/.bin/ts-node ./index.ts`
NodeJS server started...
๊ฐ์ ๋ฌธ์ , ์ด๋ป๊ฒ ํด๊ฒฐํฉ๋๊น?
[[16:13:36] [nodemon] restarting due to changes...
[16:13:36] [nodemon] starting `node test/phantomFlow/test/test.js --delay 2.5 --ignore test/`
Parallelising 1 test files on 1 processes.
Picking up job: flows\carepilotweb.test.js
events.js:160
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE :::9001
at Object.exports._errnoException (util.js:1026:11)
at exports._exceptionWithHostPort (util.js:1049:20)
at Server._listen2 (net.js:1257:14)
at listen (net.js:1293:10)
at Server.listen (net.js:1389:5)
at Function.app.listen (C:\workspace\deleteme_0420\carepilot-web\test\phantomFlow\node_modules\connect\lib\proto.js:232:24)
at Object.<anonymous> (C:\workspace\deleteme_0420\carepilot-web\test\phantomFlow\test\test.js:46:4)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
[16:13:36] [nodemon] app crashed - waiting for file changes before starting...
](url)
ํธ์งํ๋ค:
์ด๋ ๊ฒ gulp ํ์ผ์ ํธ์งํ๋ฉด ์์
์
๋๋ค.
gulp.task('report-debug', /*['clean-build-app-dev', 'validate-devserver-scripts'],*/ function(){
// start nodemon to load test.js
plugins.nodemon({ script: 'server/server.js', ext: 'js', watch: ['server/'], args:['--ignore', 'test/'], env: { NODE_ENV: 'development' } })
.on('start', function () {
plugins.nodemon({ script: 'test/phantomFlow/test/test.js', watch: ['server/'], args:['debug', '--ignore', 'test/'], stdout: false })
.on('readable', function() {
this.stdout.on('data', function(chunk) {
if (/Completed /.test(chunk)) {
const { exec } = require('child_process');
exec('node test/phantomFlow/test/test.js report', ['--ignore', 'test/']);
}
process.stdout.write(chunk);
});
this.stderr.pipe(process.stderr);
});
});
});
์ฌ๊ธฐ์ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ์ฌ๋ฌ ํ ์คํธ ํ์ ์ฐพ์ ์ ์ผํ ๊ฒ์ Linux์์ ์๋ก ์ค์นํ OS๋ก ํด๊ฒฐ๋์๋ค๋ ๊ฒ๋ฟ์ ๋๋ค. ๋ฌผ๋ก ๋งค๋ฒ ํด๋ฆฐ ์ค์น๋ ํ์ง ์๊ณ ๊ทธ๋ฅ ์ด์ฌ๋ ๊ฑฐ๋ฆฌ๊ธฐ๋ง ํ์ต๋๋ค.
์ฌ๊ธฐ OSX์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ชจ๋ ๋ ธ๋ ํ๋ก์ธ์ค ์คํ ์ ์ง(1.12.0)
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
์๋์, ์์ง ๋ฌธ์ ์ ๋ค์ ์ง๋ฉดํ์ง ์์์ต๋๋ค. nodemon์ด ํ๋ก์ธ์ค๋ฅผ ์๋ ์์ธ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด๋ค ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
๋๋ ๋ํ ์ฐ๋ถํฌ 16.04, nodemon 1.12.1 ๋ฐ node v8์์ ์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค. ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ์ข ๋ฃํ๋ ๊ฒ ์ธ์๋ ํด๊ฒฐ์ฑ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
์ด์ ์ฃผ์์์ ๋ด๊ฐ ํ ์ผ์ ๋ ์์ธํ ์ค๋ช
ํ์๋ฉด, ๋ด ํ๋ก๊ทธ๋จ์ ๋ณด๋ธ ์ ํธ( SIGUSR2
)๋ก ์ธํด ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋์ง ์์์ต๋๋ค. ๋์ ์ ํธ๋ฅผ SIGHUP
๋ก ๋ณ๊ฒฝํด์ผ ํ์ต๋๋ค.
nodemon.json
๋ผ๋ ํ์ผ์ ๋ง๋ค์์ต๋๋ค.
{
"signal": "SIGHUP",
"env": {
"NODE_ENV": "development"
},
"ext": "ts",
"exec": "ts-node --inspect ./lib/server.ts"
}
๋ด package.json์์ npm ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ nodemon์ ์คํํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํด์ผ ํฉ๋๋ค.
"dev": "nodemon",
๋ฌธ์ ๋ ts-node
์์ฒด์ ์์ต๋๋ค. https://github.com/TypeStrong/ts-node/pull/458
Windows์์ ์ด ์ค๋ฅ์ ์ฑ/ํ๋ก๊ทธ๋จ์ ์ ๊ฑฐํ๋ ค๋ฉด ํฌํธ 3000์์ PID ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ง์ง ๋ฌธ์ ๋ nodemon
๊ฐ child_process.spawn
๋์ child_process.fork
๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ค๋ ๊ฒ ์
๋๋ค. ์ด ๊ฒฝ์ฐ ๋ถ๋ชจ๋ฅผ ์ฃฝ์ด๋ ๊ฒ์ด ์์์ ์ฃฝ์ด๋ ๊ฒ์ ์๋๋๋ค .
์ด์ ๋ํ ํด๊ฒฐ์ฑ
์ ๋
ธ๋ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ๋ child_process.fork
nodemon
๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ๊ฒ์
๋๋ค( ๋
ธ๋ ๊ฐ ์๋ ์คํ ํ์ผ์ ๊ฒฝ์ฐ child_process.spawn
). ๋ถ๋ชจ๊ฐ ์ฌ๋งํ๋ฉด ํจ๋ ฅ์ด ๋ฐ์ํฉ๋๋ค.
child_process.fork
๋ฅผ ์ฌ์ฉํ๋ฉด process.send
๋ฐ process.on
๋ฉ์๋๋ฅผ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ถ๋ชจ์ ์์ ๋
ธ๋ ํ๋ก์ธ์ค ๊ฐ์ ํต์ ์ IPC ์ฑ๋์ ์ฌ์ฉํ๋ ์ถ๊ฐ ์ด์ ์ด ์์ต๋๋ค. .
์ฌ๊ธฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ๋จํ PR์ ๋ง๋ค์์ต๋๋ค(๊ทธ๋ฌ๋ ์์ง CI ํ ์คํธ๋ฅผ ํต๊ณผํ์ง ์์): https://github.com/remy/nodemon/pull/1134
๊ด๋ฆฌ์๊ฐ ์ฝ๋๋ฅผ ๋์ฑ ๊ตฌ์ฒดํํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ ๋์ค์ ๋์์ ์ค ์๊ฐ์ด ์์ผ๋ฉด ๊ทธ๋ ๊ฒ ํ๊ฒ ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ฉํ ์ ์๋ ์์ ์์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// NOTE: this ONLY works when using nodemon as a `require` module.
// I don't have a solution for booting nodemon from the CLI. Sorry!
var nodemon = require('nodemon');
process
// Handle normal exits
.on('exit', (code) => {
nodemon.emit('quit');
process.exit(code);
})
// Handle CTRL+C
.on('SIGINT', () => {
nodemon.emit('quit');
process.exit(0);
});
tl;dr child_process.fork
๋ ๋ถ๋ชจ๊ฐ ์ฃฝ์ผ๋ฉด ์์ ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๊นจ๋ํ ์๋ฃจ์
์
๋๋ค. nodemon
๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์๋๋ก ์์ ๋์ด์ผ fork
๋ณด๋ค๋ spawn
(๋ node
์คํ ์ ์ฉ).
์ด๋ค ๋ฐฉ๋ฒ์ด ์ฌ๋ฐ๋ฅธ์ง ์์๋ด๊ธฐ ์ํด ์ ์ฒด ํํ ์ ํ๋ฅผ ๊ฑฐ์ณค๋ ๊ธฐ์ต์ด ๋ฉ๋๋ค. IIRC spawn
๋ spawn์ด ๋์๊ฒ ์ฃผ์์ง๋ง ํฌํฌ(์ธ)๊ฐ ์ ๊ณตํ์ง ์์ ์ผ๋ถ ๋งํฌ๋ฅผ ์ ์งํ๋ ๋ฐ ์ฌ์ฉํด์ผ ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
์ด๊ฒ์ด ํจ๊ณผ๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ฉด ๋ชจ๋ ํ ์คํธ๋ฅผ ํต๊ณผํ PR์ ์์ ๋กญ๊ฒ ๋ณด๋ด์ฃผ์ญ์์ค.
์, ์ฃ์กํฉ๋๋ค. PR์ ๋์ณค์ต๋๋ค. ํ์ง๋ง ๋ค, ์คํจํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ํฌํฌ๋ฅผ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์, ์, ์ ๊ฐ ๋งํ๋ฏ์ด node
๋ฌธ์์ ๋ช
์๋์ด ์๋ฏ์ด fork
๋ ํนํ ์์ ๋
ธ๋ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๋
ธ๋ ํ๋ก์ธ์ค์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ด๋ฉฐ spawn
๋ ๋ค๋ฅธ ๋ชจ๋ ๋น๋
ธ๋ ํ๋ก์ธ์ค.
child_process.fork() ๋ฉ์๋๋ ํนํ ์ Node.js ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ child_process.spawn()์ ํน๋ณํ ๊ฒฝ์ฐ์ ๋๋ค. child_process.spawn()๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ChildProcess ๊ฐ์ฒด๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋ฐํ๋ ChildProcess์๋ ๋ถ๋ชจ์ ์์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ์ถ๊ฐ ํต์ ์ฑ๋์ด ๋ด์ฅ๋์ด ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ subprocess.send()๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options
ํ๋ณด๋ฅผ ๊ณ์ํ ์ ์์์ง ์ง์ผ๋ด์ผ๊ฒ ์ง๋ง ์๊ฐ์ด ์ผ๋ง ์ ๊ฑธ๋ฆด ์๋ ์์ต๋๋ค. .apply
๋น์ ์ด ์ ํ๋ฅผ ๊ฑธ ๋ ์ฌ์ฉ spawn
๋๋ ์ ๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋๋ค, ์ฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌ ํ ์์๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ ๊ฒ stdin/out/err
์ ํจ๊ป ํ ์์๋ silent: true
ํฌํฌํ ๋ ์ต์
์ผ๋ก
ํ ์คํธ์์ ํ์ PID๋ฅผ ํ์ธํ๊ฑฐ๋ stdin/out์ ํ์ธํ๊ฑฐ๋ ..?
spawn
๊ฐ ์ ์ฅ์์ ๋ํ ์ ์ผํ ๋ต์ด๋ผ๊ณ ํ์ ํ๋ค๋ฉด ์์ฑ๋ ์์์ PID๋ฅผ ์ ์ฅํ๊ณ .on('exit')
, .on('SIGINT')
์ฃฝ์ด๋ ๊ฒ์ด ์ข์ต๋๋ค. etc... ๊ทธ๋๋ fork
์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๊ธฐ์์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฉฐ์น ์ ์ NodeJS 6.4.0์์ NodeJS 8.90์ผ๋ก ๋์ด๊ฐ ๊ฒ ๊ฐ์ต๋๋ค.
CTRL+C๋ก nodemon
๋ฅผ ์ฒ์ ์ค์งํ ๋ค์ ๋ค์ ์์ํด์ผ ํ ๋ ๋ฐ์ํฉ๋๋ค.
์ด์ ๋งค๋ฒ [Windows 10] ์์ ๊ด๋ฆฌ์๋ฅผ ํตํด ๋ ธ๋ ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ์ข ๋ฃํด์ผ ํฉ๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค.
$ node -v
v8.9.2
$ nodemon -v
1.12.5
@heisian ์ ์์ ์ ์ฌ๊ธฐ์์ ๋ณํฉ๋์์ผ๋ฉฐ ์ด ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํด๊ฒฐํด์ผ ํฉ๋๋ค. ์์ ๐ ํ์ฌ ๋ผ์ด๋ธ [email protected]
์ฟ! ๋์์ด ๋์๋ค๋ ๊ธฐ์ฉ๋๋ค.
@heisian ๋ช ๋นํธ๊ฐ ์ฌ๊ธฐ ์ ๊ธฐ์ ๊ฒ๊ณผ ๊ด๋ จ๋จ ).
ํ , ์๋ง๋ run.js
๋ด์์ ์์ ๋
ธ๋ ํ๋ก์ธ์ค์ ๋ํ ์ธ์๊ฐ ์ฐธ์กฐ๋๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ช
ํํ์ง ์์์ต๋๊น?
forkArgs
๋ณ์๋ก ์ด๋ํ๊ธฐ ์ํด ๋
ธ๋์ ์ ๋ฌํด์ผ ํ๋ ๋ชจ๋ ์ธ์๋ฅผ ์๋ํ์ต๋๋ค.
child = fork(options.execOptions.script, forkArgs, {
...
});
์๋ฅผ ๋ค์ด ์ฝ๋๋ฅผ ๋ณํํ๋ ํ๋ก์ธ์ค๋ฅผ ๋ถ๊ธฐํฉ๋๋ค.
child_process.fork('./', [
'--out-dir', './dist',
'--ignore', './coverage,./dist,./docs,./embed,node_modules,shared/cli,' +
'shared/docker,bin/tools,admin/src,main/src,partner/src,*.swp,*.swo,' +
'admin/build,main/build,partner/build,**/tests,shared/webpack,./stories',
'--copy-files',
// Presets/Plugins are defined in <project_root>/.babelrc
], {
execPath: './node_modules/.bin/babel',
});
์ด ๋ชจ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
./node_modules/.bin/babel --out-dir ./dist --ignore ./coverage,./dist,./docs,./embed,node_modules,shared/cli,shared/docker,bin/tools,admin/src,main/src,partner/src,*.swp,*.swo,admin/build,main/build,partner/build,**/tests,shared/webpack,./stories --copy-files
์, ๋ก์ปฌ ํ
์คํธ์์ ์๋ํด ๋ณด์์ต๋๋ค. CLI ์ธ์์ ์์ผ๋ฉด ์ค์ ๋ก --inspect
์ญ์ ํ๋ .splice(1)
๊ฐ ์์ง๋ง ์๋ํ์ง ์์ต๋๋ค. ๋๋ฒ๊ฑฐ๊ฐ ์ด๋ ค ์์ง ์์ ๋ฉ์ธ ๋
ธ๋ ํ๋ก์ธ์ค(ํ์ฌ nodemon.js๋ฅผ ์คํ ์ค์ธ ํ๋ก์ธ์ค)๋ฅผ ๋ถ๊ธฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ง๊ธ์ ์๋ฃจ์ ์ ํดํนํ์ผ๋ฉฐ(PR์ ์ฃผ์ ์ฐธ์กฐ) ์ต์ ๋ฌธ์ ๋ฅผ ์์ ํ์ง๋ง ์ด๊ฒ์ด ๋ฐฉํ์ธ์ง 100% ํ์ ํ ์๋ ์์ต๋๋ค.
์, ๊ฒํ ํ๊ณ ๋ ๋์ ์๋ฃจ์
์ด ์๋์ง ํ์ธํ๊ฒ ์ต๋๋ค. ์, ๋๋ ๊ทธ๊ฒ์ด ์ฌ์ค์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. --inspect
๋ ์์์๊ฒ ์ ๋ฌ๋๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ํ๋๊ทธ๊ฐ ์ง์ ๋์ด์ผ ํฉ๋๋ค.
1.12.1
์์ 1.12.7
๋ก ์
๋ฐ์ดํธ๋์์ง๋ง ๊ณ์ ๋ฐ๋ ์ค
Port xxxx is already in use
[nodemon] app crashed - waiting for file changes before starting...
Nodemon์ ์ข ๋ฃํ ํ ๋ค์ ์์ํ ๋(CTRL+C).
(Windows 10) ๋ฐ ์ถ๊ฐ :heart: @remy์๊ฒ !
๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ์ถํ๊ณ Windows(git bash ๋ฑ)์์ ์คํ ํ๋ ๋ฐฉ๋ฒ ์
@remy ํ์คํ, #1164
์ต์คํ๋ ์ค ์๋ฒ๋ฅผ ์คํํ์ง ์์ง๋ง nodejs ๋ท ์์ผ์ ์คํํ๊ณ ์์ผ๋ฉฐ nodemon -v์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค: 1.14.2
๋
ธ๋ -v: 9.4
์ฐ๋ถํฌ/์ ๋์ผ
๊ทธ๋์ ์๋ง๋ ์์์ ์ธ๊ธํ ํ๋ณด๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ์๊น์?
nodemon์ด ์ถฉ๋ํ์ง ์์ผ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ผ ๋ค์ ์์๋์ง๋ง nodemon์ด ์ถฉ๋ํ๊ฑฐ๋ ์ข
๋ฃํด์ผ ํ๋ ๊ฒฝ์ฐ ์์ผ์ ๊ณ์ ์คํํ๊ณ nodemon์ ๋ค์ ์คํํ๊ธฐ ์ ์ pkill node
ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํฌํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ค๋ฅ.
์ฐธ๊ณ : ๋ท ์์ผ์ ์์ํ๋ ๋ด ๋ชจ๋์๋ ํฌ ์ฝ๋๊ฐ ๋ด์ฅ๋์ด ์์ผ๋ฏ๋ก cntrl-c(SIGUP)์ ๊ฐ์ด ํ๋ก์ธ์ค๊ฐ ๊ฐ์๊ธฐ ์ข ๋ฃ๋๋ฉด ์์ผ์ด ์ข ๋ฃ๋ฉ๋๋ค. ์ฐธ๊ณ ๋ก ์ ๋ on-death ๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
babel์ ์ฌ์ฉํ์ง ์๊ณ nodemon --require @std/esm
์์์ ๊ฐ์ด @std/esm์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋จผ์ ์์ ํ๋ก์ธ์ค๊ฐ ์ค์ ๋ก ๋ถ๊ธฐ๋๊ณ ์์ฑ๋์ง ์์๋์ง ํ์ธํ๋ ค๊ณ ํฉ๋๋ค. ์์ ํ๋ก์ธ์ค์์ ๋ค์์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ:
process.send('some message')
// Should not throw an error
...๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ๋์๊ฒ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค:
process.on('message', function(message) {
process.stdout.write(message)
})
// Should output 'some message'
...๊ทธ๋ฌ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ค์ ๋ก child_process.fork
๋ก ๋ถ๊ธฐ๋์์ผ๋ฉฐ ๋ถ๋ชจ๊ฐ ์ข
๋ฃ๋ ๋ ์ ์์ ์ผ๋ก ์ข
๋ฃ๋์ด์ผ ํฉ๋๋ค. ์์ ๋ฐฉ๋ฒ์ด ์๋ํ์ง ์์ผ๋ฉด ์์ ํ๋ก์ธ์ค๊ฐ spawned
์ด๋ฏ๋ก SIGKILL
process.on('exit')
ํ๋ก์ธ์ค ์ข
๋ฃ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ค์ค๋ก ์์๋ด์ผ ํฉ๋๋ค
๋๋ ๋ํ ์ต์ ๋ฒ์ ์ nodemon:1.17.3 ์ค ํ๋์์ ์ด๊ฒ์ ๊ฒฝํํ๊ณ ์์ต๋๋ค
๋ํ macOS High Sierra v10.13.4์์ nodemon 1.17.3, node 9.2.0์์ ์ด๊ฒ์ ๊ฒฝํํ๋๋ฐ, ์์ @johnnydimas ํ ๋ผ์ด๋ ์๋ฃจ์ ์ผ๋ก ์ง๊ธ๊น์ง ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
Ubuntu 18.04 ๋ฐ 17.10์์๋ ์ด๊ฒ์ ์ป์ต๋๋ค.
์ด๊ฒ๋ ๊ฐ์ง๊ณ ! ๋ชจ๋ ํจํค์ง๋ฅผ ์ต์ ์ํ๋ก ์ ์งํฉ๋๋ค.
macOS High Sierra v10.13.2์์
@lukebrewerton @MissAnichka @danielo515 @cormickjbrowne @ajones @sinonkt @nodediggity
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ค์ ๋ก๋ nodemon์ด ์๋๋ผ babel-node์
๋๋ค!
npm i kexec -D
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค
์ค๋ช
:
https://github.com/babel/babel/issues/1062#issuecomment -84526036
ํธ์งํ๋ค:
์ฝ๊ฐ ์ด๊ดํ๊ณ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ง ์์์ต๋๋ค.
๊ทธ๋ฌ๋ babel-node๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ =D๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
๋๋ babel์ ์ฌ์ฉํ์ง ์๊ณ ํ๋ฒํ ์ค๋๋ ๋ ธ๋ js๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ ธ๋ 9.5๊ฐ ์๋ nodemon 1.17.5์์ ์ฌ์ ํ ์ด๊ฒ์ ์ป๊ณ ์์ต๋๋ค.
๋ถํํ๋ node -r ts-node/register index.ts
์คํ ์ค์
๋๋ค.
@Kamshak ์ ๋ฌธ์ ๋ฅผ ์ด๊ณ ๋ณต์ ๊ฐ๋ฅํ ์์ ๋ก ์์ฝ๋ index.ts๋ฅผ ํฌํจํ์ญ์์ค.
macOS 10.13.3์ nodemon 1.18.3 ๋ฐ node 8.11.4์์ ์ฌ์ ํ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋์ผํ ๋ฌธ์ .... Ubuntu 18.04 LTS์ nodemon 1.18.3 ๋ฐ ๋ ธ๋ 8.11.4. ๋ํ ๋ช ์ ์ ์ผ๋ก SIGHUP์ ์ฌ์ฉํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ณ 2500ms์ ์ถ๊ฐ ์ง์ฐ์ ์ถ๊ฐํ์ฌ nodemon ๊ตฌ์ฑ ๊ฒฝ๋ก๋ฅผ ์๋ํ์ต๋๋ค ..... ๋ถํํ๋ ๊ธฐ์จ์ด ์์ต๋๋ค ....
WebStorm ํฐ๋ฏธ๋ ํจ๋์ ํตํด nodemon์ ์คํํ๊ณ IDE๋ฅผ ๋ค์ ์์ํ ํ(๋๋ ํฐ๋ฏธ๋ ํจ๋์ ๋ค์ ์ฐ ํ) EADDRINUSE๊ฐ ์๋ ๊ฒฝ์ฐ ํ๋ก์ธ์ค ๋ชฉ๋ก์ ๋๋ฝ๋ nodemon ํ๋ก์ธ์ค๊ฐ ๋จ์ ์๋์ง ํ์ธํ์ญ์์ค. ์ฐ๋ถํฌ 18.04์์ ๋์๊ฒ ์ผ์ด๋ฌ์ต๋๋ค.
ํํธ๋ฅผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค @dchekanov . vscode๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. nodemon์ด ๋ค์ ์์ํ๋ ค๊ณ ํ ๋๋ง๋ค EADDRINUSE ์ค๋ฅ๊ฐ ์์ ์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ด ๋ nodemon ํ๋ก์ธ์ค ์ฌ์ด์ ์ผ์ข ์ ๊ฒฝ์ ์กฐ๊ฑด์ด ๋๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์๊ณ ์์ด.
๋
ธ๋๋ชฌ -v 1.18.4
๋
ธ๋ -v v8.11.1
macOS ๋ชจํ๋น ๋ฒ์ 10.14
VSCode ํฐ๋ฏธ๋
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. https://github.com/aecorredor/express-graphql-postgres-starter ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ณต์ ํ๊ณ yarn
๋ฅผ ์คํํ ๋ค์ yarn start
๋ฅผ ์คํํ๊ณ ๋ณ๊ฒฝํ๊ณ ์ ์ฅํ๊ณ ์ค๋ฅ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. . ๋๋ ๋์์ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ๋ ๊ทธ๋ฅ nodemon --exec babel-node index.js
๊ฐ์ ๋ฌธ์ ์
๋๋ค. 1.18.6.
Ubuntu์ Docker์์ ์คํ, ๋
ธ๋ 10.11
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ !
๊ทธ๊ฒ์ ๋๋ฅผ ๋์๋ค
yarn add --dev kexec
์ ๋ ์ต๊ทผ์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค....
์๋ง๋ ๋์ปค ์
๊ทธ๋ ์ด๋์ ์์ธ์ด ๋ ๊ฒ์
๋๋ค ... ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค ...
์๋๋ฆฌ๋์ฆ...
์๋ ํ์ธ์ @justintien ,
๋๋ nodemon์์ ์ด ๋ฌธ์ ์ ์ฌ๋ฌ ๋ฒ ์ง๋ฉดํ์ง๋ง ํ๋ก๋์ ์์ ์ฌ์ฉํ๋ pm2 ํจํค์ง(http://pm2.keymetrics.io/)๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์ถ๊ฐํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ํ์ญ์์ค. pm2 start src/server.ts --watch --no-daemon
ES6 ์คํฌ๋ฆฝํธ๊ฐ ์๋ ๊ฒฝ์ฐ typescript ๋ชจ๋์ ์ฌ์ ์ค์นํด์ผ ํ๋ฉฐ ๋ค์์ ์ฌ์ฉํ์ฌ postintall์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
"postinstall": "$(yarn bin)/pm2 install typescript"
์ด ๋์์ ๋ฐ๋๋๋ค.
๋๋ฅผ ์ํด ์ผํ ์ ์ผํ ๋ฐฉ๋ฒ์ "signal": "SIGTERM",
์ nodemon.json
์
๋๋ค.
์ ๋ Yarn, Docker ๋ฐ Alpine 10์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@lukebrewerton @MissAnichka @danielo515 @cormickjbrowne @ajones @sinonkt @nodediggity
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ค์ ๋ก๋ nodemon์ด ์๋๋ผ babel-node์ ๋๋ค!
npm i kexec -D
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค์ค๋ช :
babel/babel#1062 (๋๊ธ)ํธ์งํ๋ค:
์ฝ๊ฐ ์ด๊ดํ๊ณ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ง ์์์ต๋๋ค.
๊ทธ๋ฌ๋ babel-node๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ =D๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธ๋ ๋ชจ๋ ํจํค์ง์ ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ kexec
ํ๋ฉด ์ด๋ป๊ฒ ๋ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ kexec
ํจํค์ง๊ฐ ์ ๊ทน์ ์ผ๋ก ์ ์ง ๊ด๋ฆฌ๋์ง ์๋ ๊ฒ ๊ฐ์์ ํ์คํ์ง ์์ต๋๋ค.
1.18.6์ ์ฌ์ฉํ์ฌ npmi kexex
๊ฐ ์๋ํ์ง ์์์ต๋๋ค.
์ฌ๋ฌ๋ถ, ์ด๊ฒ์ ํ์์ ์ด๊ณ ์ง์๋์ง ์๋ ๋ฌธ์ ์ ๋๋ค. ์ต์ nodemon์์ ๋ณด๊ณ ์๋ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ณต์ ๋ฐฉ๋ฒ์ ๋ํ ์์ ํ ์ง์นจ๊ณผ ํจ๊ป ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ์ญ์์ค.
๋๋ ์ด๋ฏธ ๊ฐ์ ๋ฌธ์ ์ ๋ํด ์ด๊ฒ์ ๋งํ์์ ์ฃผ๋ชฉํ์ญ์์ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ๋ด๊ฐ ๋ซํ ๋ฌธ์ ๋ฅผ ๋ชจ๋ํฐ๋งํ์ง ์๋๋ค๋ ๊ฒ์ ์์์ฃผ์ธ์.
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ yarn global add nodemon@next
๋ช
๋ น์ผ๋ก 1.12.6 ๋ฒ์ ์ ์ค์นํ์ฌ ์ ๊ฑฐํ ๋ค์ ๋ชฉ๋ก์์ 1.12.6 ๋ฒ์ ์ ์ ํํ๊ฑฐ๋ ๊ฐ๋จํ yarn global add [email protected]
๋ฅผ ์คํํ ์ ์์ต๋๋ค @remy ์๋ฃจ์
: https://github.com/remy/nodemon/issues/1025#issuecomment -351394591
๋์ปค: ๋
ธ๋:10-์ํ์ธ
๋
ธ๋: v10.6.0
๋
ธ๋๋ชฌ: v1.18.7
์ด์ ๋ฅผ ์ฐพ์์ต๋๋ค.
PID USER TIME COMMAND
1 root 0:00 /bin/sh -c npm i npm run dev -- -L
16 root 0:00 sh
22 root 0:00 npm
32 root 0:00 sh -c nodemon ./src --exec babel-node "-L"
33 root 0:01 node /app/node_modules/.bin/nodemon ./src --exec babel-node -L
46 root 0:00 sh -c babel-node ./src
47 root 0:00 node /app/node_modules/.bin/babel-node ./src
53 root 0:00 /usr/local/bin/node /app/node_modules/babel-cli/lib/_babel-node ./src
# if watch change, restarting due to changes...
# after: it's didn't kill sub child -> 47 & 53
1 root 0:00 /bin/sh -c npm i npm run dev -- -L
16 root 0:00 sh
22 root 0:00 npm
32 root 0:00 sh -c nodemon ./src --exec babel-node "-L"
33 root 0:15 node /app/node_modules/.bin/nodemon ./src --exec babel-node -L
47 root 0:00 node /app/node_modules/.bin/babel-node ./src
53 root 0:09 /usr/local/bin/node /app/node_modules/babel-cli/lib/_babel-node ./src
78 root 0:00 sh -c babel-node ./src
79 root 0:00 node /app/node_modules/.bin/babel-node ./src
85 root 0:01 /usr/local/bin/node /app/node_modules/babel-cli/lib/_babel-node ./src
๋๋ ์ด๋ฏธ ์๋:
app_1 | /app/node_modules/babel-cli/lib/babel-node.js:70
app_1 | if (err.code !== "MODULE_NOT_FOUND") throw err;
app_1 | ^
app_1 |
app_1 | Error: Error loading shared library /app/node_modules/kexec/build/Release/kexec.node: Exec format error
app_1 | at Object.Module._extensions..node (internal/modules/cjs/loader.js:718:18)
app_1 | at Module.load (internal/modules/cjs/loader.js:599:32)
app_1 | at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
app_1 | at Function.Module._load (internal/modules/cjs/loader.js:530:3)
app_1 | at Module.require (internal/modules/cjs/loader.js:637:17)
app_1 | at require (internal/modules/cjs/helpers.js:20:18)
app_1 | at Object.<anonymous> (/app/node_modules/kexec/index.js:1:80)
app_1 | at Module._compile (internal/modules/cjs/loader.js:689:30)
app_1 | at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
app_1 | at Module.load (internal/modules/cjs/loader.js:599:32)
@mohamed-badaoui
ํ๋ก๋์
์์๋ nodemon์ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ๋ฐ์์ฉ์ผ๋ก๋ง ์ฌ์ฉํ์ต๋๋ค.
ํ๋ก๋์
์์ ๋์ปค๋ฅผ ์ฌ์ฉํฉ๋๋ค. :๋ถํ๋ค:
[email protected] ๋ฐ [email protected] ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค.
๊ทธ๋์ nodemone์ 1.18.8๋ก ์
๋ฐ์ดํธํด์ผ ํ๊ณ , ์ด์ ์๋ํฉ๋๋ค โ
TS ๋ฐ Apollo ์๋ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@alienalien13์ด ๋งํ ๊ฒ์ ํ์ธํ๋ฉด์ ์ ๋ Nodemon 1.18.9 ๋ฐ NodeJS 11.4.0 ์คํ ์ค์ ๋๋ค.
์์!
1.18.9๋ก ์ ๊ทธ๋ ์ด๋ํ๋ฉด ์ ์๋ํฉ๋๋ค!!
์์ฒญ๋!!
@mohamed-badaoui
๊ณ ๋ง์ ์น๊ตฌ ! ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค โ
์ด์ ์ฃผ์์์ ๋ด๊ฐ ํ ์ผ์ ๋ ์์ธํ ์ค๋ช ํ์๋ฉด, ๋ด ํ๋ก๊ทธ๋จ์ ๋ณด๋ธ ์ ํธ(
SIGUSR2
)๋ก ์ธํด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ง ์์์ต๋๋ค. ๋์ ์ ํธ๋ฅผSIGHUP
๋ก ๋ณ๊ฒฝํด์ผ ํ์ต๋๋ค.
nodemon.json
๋ผ๋ ํ์ผ์ ๋ง๋ค์์ต๋๋ค.{ "signal": "SIGHUP", "env": { "NODE_ENV": "development" }, "ext": "ts", "exec": "ts-node --inspect ./lib/server.ts" }
๋ด package.json์์ npm ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ nodemon์ ์คํํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํด์ผ ํฉ๋๋ค.
"dev": "nodemon",
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก "signal": "SIGHUP"
์ถ๊ฐํ๋ฉด ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
@Mutmatt nodemon v1.18.10์ "์ ์ ์๊ฑฐ๋ ์๊ธฐ์น ์์ ์ต์ : --inspect"๋ฅผ ์๋ ค์ค๋๋ค.
@bennyn package.json
์ ํ ๋ช
๋ น์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์: nodemon.json
{
"signal": "SIGHUP",
"ext": "ts",
"exec": "npm run serve",
"watch": ["src"]
}
์ ๊ฒ ์ด์! ๋ฐ๋ผ์ ts-node
์์ ์ ๊ฑฐ๋ ํ๋๊ทธ์
๋๋ค. ๋ฏธ์ํฉ๋๋ค ์ ์๋ชป์
๋๋ค. ๐
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์
Error: listen EADDRINUSE
nodemon: 1.18.11
node: 10.14.1
๋ชจ๋ ๊ฒ์ด ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค :(
ts-node + nodemon ์ฌ์ฉ
๋๋ Visual Studio ํฐ๋ฏธ๋, ์ฐ๋ถํฌ 18์ ์ฌ์ฉํ๊ณ ์์๊ณ , ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํฐ๋ฏธ๋์ ์ข
๋ฃํ๊ณ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์ ์ข
๋ฃํ๋ ๊ฒ์ด ์์ต๋๋ค.
Visual Studio ์ธ๋ถ์์ ์ ํฐ๋ฏธ๋ ์์
๊ทธ๋์ ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
์๋ก
์ ์ญ์ ์ผ๋ก nodemon์ด ์ค์น๋์ด ์๋์ง ํ์ธํ์ญ์์ค. ๊ทธ๊ฒ์ ์ ๊ฑฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
ํ๊ฒฝ ๋ณ์์ dotenv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋๋ฐ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋ฅผ ์ํด ๊ทธ๊ฒ์ '.env'ํ์ผ์ด์์ต๋๋ค.
๊ทธ๊ฑด ๋ง์น:
PORT=3000,
json์์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๋ ๊ฒฝ์ฐ ์ผํ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
์ด๊ฒ์ด ๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ๊ฒ
npm cache clean -force
"autoAttachChildProcesses": true
์ต์
์ด ํด๊ฒฐ๋์์ต๋๋ค.
"autoAttachChildProcesses" ์ต์ : true๋ก ํด๊ฒฐ๋จ
nodemon.json
์์ ๊ตฌ์ฑํ์ต๋๊น? ์๋๋ฉด ์ด ์ต์
์ ์ด๋์ ๋ฐฐ์นํด์ผ ํฉ๋๊น?
์ง๊ธ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋จ์ ์๋ ๊ฒ์ด ์์ง๋ง ์๋ ๊ฒ ๊ฐ์ผ๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋๋ฒ๊ทธํ๋ ค๊ณ ํ์ต๋๋ค.
"nodemon": "^1.19.1",
node: v10.16.2
npm: 6.9.0
๋๊ตฌ๋ ์ง ์ด์ ๋ํ ์ ์ ํ๊ณ ๊นจ๋ํ ์๋ฃจ์ ์ ์์ ๋์ต๋๊น?
Windows์์ "node.exe Node.js: ์๋ฒ ์ธก JavaScript" ํ๋ก์ธ์ค๋ฅผ ์ค์งํฉ๋๋ค.
์๋ฒ๋ฅผ ์์ํ๋ js ํ์ผ์ ๋งจ ์๋์ ๋ค์์ ์ถ๊ฐํ์ญ์์ค.
process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); })
์ฒ๋ง์์!
์ฐธ๊ณ ๋ก ์ฌ์ ํ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ ์ฌ๋์ด ์๋ค๋ฉด ๋ค์๋ ์๋ํด ๋ณด์ธ์.
๋๋ ์์ฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ฐ๋จํ yarn cache clean
๊ฐ ๋๋ฅผ ์ํด ๋ง์ ์ ๋ถ๋ ธ๋ค.
npm ์ฌ์ฉ์์ ๊ฒฝ์ฐ npm cache clean
์๋ํ์ญ์์ค.
๊ทธ๋์ nodemon์ด ์คํ๋ ๋ ์ฃฝ์ด๋ ๋ฐฉ๋ฒ์ ์๋์???
์ต์ nodemon์ผ๋ก ์
๋ฐ์ดํธํ๊ณ NPM ์
๊ทธ๋ ์ด๋์ ํจ๊ป ๋
ธ๋ 6์์ 10์ผ๋ก ์ด๋ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์คํํฉ๋๋ค.
"๋
ธ๋๋ชฌ": "^1.19.2",
๋
ธ๋: 10.16.0
npm: 6.9.0
@doc82 ์ด ํน์ ๋ฌธ์ ๋ ๋งค์ฐ ๋ณต์กํ๋ฉฐ ๋งค๋ฒ ๋์ผํ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ ์์ต๋๋ค.
๋ณต์ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ผ๋ก ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด 10๋ฒ ์ค 9๋ฒ์ nodemon์ด ํ๋ก์ ํธ์์ ์คํ๋๋ ๋ฐฉ์์ผ๋ก ์ธํด "์๋ธ ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋จ"์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค
[nodemon] ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ค์ ์์ ์ค...
[๋
ธ๋๋ชฌ] ์์ node server.js
์ด๋ฒคํธ.js:183
๋์ ธ ์ด; // ์ฒ๋ฆฌ๋์ง ์์ '์ค๋ฅ' ์ด๋ฒคํธ
^^
์ค๋ฅ: EADDRINUSE :::3000 ๋ฃ๊ธฐ
Object._errnoException์์(util.js:1022:11)
_exceptionWithHostPort์์(util.js:1044:20)
Server.setupListenHandle์์ [as _listen2](net.js:1367:14)
listenInCluster์์(net.js:1408:12)
Server.listen์์ (net.js:1492:7)
๊ฐ์ฒด์์.
Module._compile์์ (module.js:652:30)
Object.Module._extensions..js์์ (module.js:663:10)
Module.load์์ (module.js:565:32)
tryModuleLoad์์(module.js:505:12)
Function.Module._load์์ (module.js:497:3)
Function.Module.runMain์์ (module.js:693:10)
์์ ์(bootstrap_node.js:188:16)
bootstrap_node.js:609:3์์
[nodemon] ์ฑ ์ถฉ๋ - ์์ํ๊ธฐ ์ ์ ํ์ผ ๋ณ๊ฒฝ ๋๊ธฐ ์ค...
[nodemon] ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ค์ ์์ ์ค...
[๋
ธ๋๋ชฌ] ์์ node server.js
ํฌํธ 3000์์ ์์ ๋๊ธฐ ์ค...
[nodemon] ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ฌ์์ ์ค...
[๋
ธ๋๋ชฌ] ์์ node server.js
์ด๋ฒคํธ.js:183
๋์ง๋ค ์ด; // ์ฒ๋ฆฌ๋์ง ์์ '์ค๋ฅ' ์ด๋ฒคํธ
^^
์ค๋ฅ: EADDRINUSE :::3000 ๋ฃ๊ธฐ
Object._errnoException์์(util.js:1022:11)
_exceptionWithHostPort์์(util.js:1044:20)
Server.setupListenHandle์์ [_listen2๋ก](net.js:1367:14)
listenInCluster์์(net.js:1408:12)
Server.listen์์ (net.js:1492:7)
๊ฐ์ฒด์์.
Module._compile์์ (module.js:652:30)
Object.Module._extensions..js์์ (module.js:663:10)
Module.load์์ (module.js:565:32)
tryModuleLoad์์(module.js:505:12)
Function.Module._load์์ (module.js:497:3)
Function.Module.runMain์์ (module.js:693:10)
์์ ์(bootstrap_node.js:188:16)
bootstrap_node.js:609:3์์
[nodemon] ์ฑ ์ถฉ๋ - ์์ํ๊ธฐ ์ ์ ํ์ผ ๋ณ๊ฒฝ ๋๊ธฐ ์ค...
[nodemon] ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ฌ์์ ์ค...
[๋
ธ๋๋ชฌ] ์์ node server.js
ํฌํธ 3000์์ ์์ ๋๊ธฐ ์ค...
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ํ์๋๋ ๊ฒฝ์ฐ:
์ค๋ฅ: '/home/dg/junesis/node_modules/bcrypt/lib/binding/bcrypt_lib.node' ๋ชจ๋
๋ค์์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ Node.js ๋ฒ์ ์ ๋ํด ์ปดํ์ผ๋์์ต๋๋ค.
NODE_MODULE_VERSION 57. ์ด ๋ฒ์ ์ Node.js์๋ ๋ค์์ด ํ์ํฉ๋๋ค.
NODE_MODULE_VERSION 64. ๋ค์ ์ปดํ์ผํ๊ฑฐ๋ ๋ค์ ์ค์นํ์ญ์์ค.
๋ชจ๋(์: npm rebuild
๋๋ npm install
).
Object.Module._extensions..node์์ (internal/modules/cjs/loader.js:807:18)
Module.load์์ (internal/modules/cjs/loader.js:653:32)
tryModuleLoad์์(internal/modules/cjs/loader.js:593:12)
Function.Module._load์์ (internal/modules/cjs/loader.js:585:3)
Module.require์์(internal/modules/cjs/loader.js:692:17)
ํ์ ์(internal/modules/cjs/helpers.js:25:18)
๊ฐ์ฒด์์.
Module._compile์์ (internal/modules/cjs/loader.js:778:30)
Object.Module._extensions..js์์ (internal/modules/cjs/loader.js:789:10)
Module.load์์ (internal/modules/cjs/loader.js:653:32)
tryModuleLoad์์(internal/modules/cjs/loader.js:593:12)
Function.Module._load์์ (internal/modules/cjs/loader.js:585:3)
Module.require์์(internal/modules/cjs/loader.js:692:17)
ํ์ ์(internal/modules/cjs/helpers.js:25:18)
๊ฐ์ฒด์์.
Module._compile์์ (internal/modules/cjs/loader.js:778:30)
[nodemon] ์ฑ ์ถฉ๋ - ์์ํ๊ธฐ ์ ์ ํ์ผ ๋ณ๊ฒฝ ๋๊ธฐ ์ค...
๋ค์ ๋ช
๋ น์ ์คํํด์ผ ํฉ๋๋ค.
rm -rf node_modules/bcrypt
npm ์ค์น
๊ทธ๋ฌ๋ ๋ด ํญ๋ชฉ ํ์ผ์์ ์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
ํ๋ก์ธ์ค
// ์ผ๋ฐ ์ข
๋ฃ ์ฒ๋ฆฌ
.on('์ข
๋ฃ', (์ฝ๋) => {
nodemon.emit('์ข
๋ฃ');
process.exit(์ฝ๋);
})
// Handle CTRL+C
.on('SIGINT', () => {
nodemon.emit('quit');
process.exit(0);
});
https://github.com/remy/nodemon/issues/1025#issuecomment -345361918 ๋๋ถ์
Windows์์ "node.exe Node.js: ์๋ฒ ์ธก JavaScript" ํ๋ก์ธ์ค๋ฅผ ์ค์งํฉ๋๋ค.
์๋ฒ๋ฅผ ์์ํ๋ js ํ์ผ์ ๋งจ ์๋์ ๋ค์์ ์ถ๊ฐํ์ญ์์ค.
process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); })
์ฒ๋ง์์!
๋์์ด ๋์์ต๋๋ค! ๊ฐ์ฌ ํด์!
๋ฐ๋น์ ๊ธฐ๋ฐ ๋ฐฐํฌํ์์ ๋ด js ํ์ผ ๋์ process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); })
๋ฅผ ์ถ๊ฐํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ๊ทธ ์ด์ ๋ฅผ 100% ํ์ ํ ์๋ ์์ง๋ง kill ๋ช ๋ น์ ํฌํจํ๋๋ก ์์ ์คํฌ๋ฆฝํธ๋ฅผ ํธ์งํ์ต๋๋ค.
์ด๊ฒ์ ๋์ ๊ฐ์ ๊ฐ๋ฐ์ ์ํด mac/*nix๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ํด์ผ ํฉ๋๋ค.
"scripts": {
"start": "npm run kill & node ./node_modules/.bin/nodemon ./bin/www",
"kill": "kill $(lsof -t -i:3000) | exit 0",
}
3000์ ์ฌ์ฉ์ค์ธ ํฌํธ์
๋๋ค. | exit 0
ํฌํธ๊ฐ ์ฌ์ฉ ์ค์ด ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฌต์ ์ฒ๋ฆฌํฉ๋๋ค. ์์ ๋ช
๋ น์ ์ด์ npm run kill &
๋ก ์ข
๋ฃ๋๊ณ ๋๊ธฐํ๋ฉฐ node ./node_modules/.bin/nodemon ./bin/www
๋ ์ผ๋ฐ์ ์ผ๋ก ์ฑ์ ์์ํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค.
๋๋ ์ ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์ด ์์ง๋ง ๊ฐ์๊ธฐ ์ง๊ธ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ฐ๋ถํฌ 18.04 "nodemon": "^2.0.2"
, ๋
ธ๋ ๋ฒ์ 13.7.0
.
๋๋ ์ ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์ด ์์ง๋ง ๊ฐ์๊ธฐ ์ง๊ธ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ฐ๋ถํฌ 18.04
"nodemon": "^2.0.2"
, ๋ ธ๋ ๋ฒ์ 13.7.0
.
๋ ๋๊ตฌ ๋ฒ์ ๋ชจ๋ ๋์ผํฉ๋๋ค. ์ด ๋ฌธ์ ๋ ์๋ง์ ์์ธ์์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์ค๋ ๋๊ฐ ์ต๊ณ ์ ์ ๋ณด์์ธ ๊ฒ ๊ฐ์์ ๋ค์ ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๊น๋ง์, ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ ํ์๋ nodemon์ ๊ณ์ ์คํ ์ค์ ๋๋ค! ์๋ฒ ํ์ผ์ ์์ ํ๊ณ ๋ณด๋ ๊ฐ์๊ธฐ pid๊ฐ ๋ค์ ๋ํ๋ฌ์ต๋๋ค. ๋๋ nodemon์ ๋์์ ์คํํ๊ณ ์์ผ๋ฏ๋ก ์ฐจ์ด๊ฐ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ ์ง๋ ์ฃผ์ ์๋ก์ด Hapi ํ๋ก์ ํธ์์ ๊ทธ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค. 5๋ฒ ์ค 4๋ฒ, nodemon์ด ๋ค์ ๋ก๋๋ ๋ EADDRINUSE ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด์ ๋ฒ์ ์ Hapi์ ๋์ผํ ๋ฒ์ ์ nodemon( 2.0.2
)์ ์ฌ์ฉํ์ฌ ์ด์ ํ๋ก์ ํธ๋ก ์์
ํ ๋ ํด๋น ์ค๋ฅ๋ฅผ ์ฌํํ ์ ์์ต๋๋ค . ์ ํ๋ก์ ํธ์ ๋์ผํ Hapi ๋ฐ nodemon ๋ฒ์ ์ผ๋ก ์ฒ์๋ถํฐ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋๋ ์ฌํํ ์ ์์ต๋๋ค. ์์ธ์ ์กฐ์ฌํด ๋ณด๊ฒ ์ง๋ง ํํผ๋ ๋
ธ๋๋ชฌ ์์ฒด๊ฐ ์๋๋๋ค.
๋๋ ์ ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์ด ์์ง๋ง ๊ฐ์๊ธฐ ์ง๊ธ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ฐ๋ถํฌ 18.04
"nodemon": "^2.0.2"
, ๋ ธ๋ ๋ฒ์ 13.7.0
.๋ ๋๊ตฌ ๋ฒ์ ๋ชจ๋ ๋์ผํฉ๋๋ค. ์ด ๋ฌธ์ ๋ ์๋ง์ ์์ธ์์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์ค๋ ๋๊ฐ ์ต๊ณ ์ ์ ๋ณด์์ธ ๊ฒ ๊ฐ์์ ๋ค์ ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์, @Ratstail91 ๊ณผ ํจ๊ป - ๋ค์ ์ด์ด์ผ ํฉ๋๋ค.
์๋ ํ์ธ์,
์ค๋๋ถํฐ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ts-node์ ํจ๊ป nodemon์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค(typescript๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐํ ํ๋ก์ ํธ)
๋๋ ์๋์ ๋ชจ๋ ๊ฒ์ ์๋ํ์ง๋ง ์๋ฌด ๊ฒ๋ ์๋ํ์ง ์์์ต๋๋ค.
์๊ธด๊ฑด ์ ๊ฐ ์ด์ nodemon์ ์
๋ฐ์ดํธ ํ๋ค๋๊ฑฐ...
๋ํฌ๋ค์๊ฒ ํด๊ฒฐ์ฑ
์ด ์๋ค๋ฉด ๋๋ ์ฌ์ ํ ์ฌ๊ธฐ ์๋ค.
๋ฉ์์ง ์ค๋ฅ๋ =>
yume-api | Error: listen EADDRINUSE: address already in use "3000"
yume-api | at Server.setupListenHandle [as _listen2] (net.js:1263:19)
yume-api | at listenInCluster (net.js:1328:12)
yume-api | at Server.listen (net.js:1426:5)
yume-api | at Function.listen (/usr/src/yume-api/node_modules/express/lib/application.js:618:24)
yume-api | at Object.<anonymous> (/usr/src/yume-api/src/server.ts:35:5)
yume-api | at Module._compile (internal/modules/cjs/loader.js:778:30)
yume-api | at Module.m._compile (/usr/src/yume-api/node_modules/ts-node/src/index.ts:814:23)
yume-api | at Module._extensions..js (internal/modules/cjs/loader.js:789:10)
yume-api | at Object.require.extensions.(anonymous function) [as .ts] (/usr/src/yume-api/node_modules/ts-node/src/index.ts:817:12)
yume-api | at Module.load (internal/modules/cjs/loader.js:653:32)
yume-api | at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
yume-api | at Function.Module._load (internal/modules/cjs/loader.js:585:3)
yume-api | at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
yume-api | at main (/usr/src/yume-api/node_modules/ts-node/src/bin.ts:226:14)
yume-api | at Object.<anonymous> (/usr/src/yume-api/node_modules/ts-node/src/bin.ts:485:3)
yume-api | at Module._compile (internal/modules/cjs/loader.js:778:30)
yume-api | at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
yume-api | at Module.load (internal/modules/cjs/loader.js:653:32)
yume-api | at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
yume-api | at Function.Module._load (internal/modules/cjs/loader.js:585:3)
yume-api | at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
yume-api | at startup (internal/bootstrap/node.js:283:19)
yume-api | [nodemon] app crashed - waiting for file changes before starting...
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ ์์ฑ๋ ์ด์ํ ์์ผ ํ์ผ "3000"์ด ์์ต๋๋ค.
๋๋ ์ ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์ด ์์ง๋ง ๊ฐ์๊ธฐ ์ง๊ธ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ฐ๋ถํฌ 18.04
"nodemon": "^2.0.2"
, ๋ ธ๋ ๋ฒ์ 13.7.0
.๋ ๋๊ตฌ ๋ฒ์ ๋ชจ๋ ๋์ผํฉ๋๋ค. ์ด ๋ฌธ์ ๋ ์๋ง์ ์์ธ์์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์ค๋ ๋๊ฐ ์ต๊ณ ์ ์ ๋ณด์์ธ ๊ฒ ๊ฐ์์ ๋ค์ ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ node
from Docker Official Images
์์ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค.
๊ทธ๋ฌ๋ Mac OS
์์ ์คํ๋๋ ๋์ปค ์ปจํ
์ด๋๋ง Windows 10
ํธ์คํธ๊ฐ ์๋๋๋ค.
๋๋ ๋ํ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ํ๋ก์ ํธ๋ฅผ ์๋์ํค๋ ค๋ฉด 3/4๋ฒ ์ฐ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ ๊ทธ๊ณ ์์ต๋๋ค. 3๋ ๋ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ผ๋ฉฐ ๋ณํฉ์ด ์์๊ณ ๋ฌธ์ ์ ์์ธ์ ์์ ํ์ต๋๋ค.
๋ ์ต๊ทผ์ ๊ฒ์ํ๋ ์ฌ๋๋ค์ ๋น์ทํ ์ฆ์์ ๊ฒช๊ณ ์์ง๋ง ๋์ผํ ์ถ์ฒ๊ฐ ์๋๋๋ค(๋ํ ๋ณต์ ํ ์ ๋ณด๊ฐ ์ ํ ์์).
์ด๋ฌํ _new_ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋ณด๊ฐ ํ์ํฉ๋๋ค. ๊ฐ์ฌ ํด์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๊ณ ์๋ฌด๋ฐ์๋ ํ์ด ๋์ค๋ ๊ฒ ๊ฐ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ด ํญ๋ชฉ js ํ์ผ์ ๋งจ ์๋์ ์ถ๊ฐํ๊ธฐ ์์ํ์ฌ ์ด๊ฒ์ด ๋ด ์คํฌ๋ฆฝํธ์ ๋ง์ง๋ง์ผ๋ก ์คํ๋ ํ์ด ๋๋๋ก ํ๊ณ , ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
CTRL+C์ OSX Sierra 10.12.5๋ฅผ ์คํํ๋ Mac์์ iTerm์ nodemon ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํฉ๋๋ค.
process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); });