PM2でノードスクリプトクラスターを作成しようとしていますが、エラーが発生して機能しません
TypeScriptのメインノードスクリプト
import express from 'express';
import mongoose from 'mongoose';
const app = express();
app.get('/', (req, res) => {
const tickets = {};
res.send(tickets);
});
const setup = async () => {
console.clear();
try {
await mongoose.connect('mongodb://127.0.0.1:27017/tickets', {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
});
} catch(err) {
console.log(err);
}
app.listen(5001, () => {
console.log('listing app on 5001');
});
}
setup();
NPM実行スクリプト
ts-node-dev --poll index.ts
私のPM2開始スクリプトprocess.json
{
"apps" : [
{
"name" : "main-server",
"script" : "npm start",
"autorestart": true,
"instances" : 4,
"exec_mode" : "cluster"
}
]
}
エラーが発生する
SyntaxError: Invalid or unexpected token
3|main-ser | at wrapSafe (internal/modules/cjs/loader.js:1047:16)
3|main-ser | at Module._compile (internal/modules/cjs/loader.js:1097:27)
3|main-ser | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1153:10)
3|main-ser | at Module.load (internal/modules/cjs/loader.js:977:32)
3|main-ser | at Function.Module._load (internal/modules/cjs/loader.js:877:14)
3|main-ser | at /usr/local/lib/node_modules/pm2/lib/ProcessContainer.js:303:25
3|main-ser | at wrapper (/usr/local/lib/node_modules/pm2/node_modules/async/internal/once.js:12:16)
3|main-ser | at next (/usr/local/lib/node_modules/pm2/node_modules/async/waterfall.js:96:20)
3|main-ser | at /usr/local/lib/node_modules/pm2/node_modules/async/internal/onlyOnce.js:12:16
3|main-ser | at WriteStream.<anonymous> (/usr/local/lib/node_modules/pm2/lib/Utility.js:186:13)
単一のインスタンス「ts-node-dev --poll index.ts」で直接コマンドを実行している場合、1回のインスタンスで正常に動作します。しかし、PM2クラスターモードでは機能せず、アプリが読み込まれません。
メインスクリプトファイルを別の方法で呼び出す必要があると思います。しばらく前に、プロセスファイルを実行しようとしました。多くの時間を費やした後、それは何とか私のために働いた。この構成で試してみてください:
{
"apps" : [
{
"name": "main-server",
"script": "./index.ts",
"node_args": [
"ts-node-dev",
"--poll"
],
"autorestart": true,
"instances": 4,
"exec_interpreter": "node",
"exec_mode": "cluster",
"env": {
"NODE_ENV": "development"
},
"env_production": {
"NODE_ENV": "production"
}
}
]
}
script
はnpmコマンドではなくファイルを呼び出していますnode_args
で与えられますexec_interpreter
はnode
またはパス全体です。 /usr/bin/nodejs
env
を定義することが重要です。pm2 start process.json
を使用して開発モードで実行し、pm2 start process.json --env production
を使用して製品モードで実行します。
未検証。幸運を。
問題は、PM2でTypeScriptコードを実行しようとしていることだと思います。私はこれを自分で試したことはありませんが、PM2用の TSプラグイン があるようです。それが機能しない場合は、常に自分でコードをトランスパイルし、その後PM2を介して実行することができます。