Tôi có 1 vấn đề như thế này, chả là cần lấy đường dẫn thư mục gốc ứng dụng để đọc các file cấu hình, thư mục chứa các router định tuyến từ thư mục gốc trong các ứng dụng webapps tôi đang xây dựng.

Phiền 1 điều là từ các file script mã nguồn, trước đó tôi sử dụng biến  require.main.filename  để lấy đường dẫn thư mục gốc.

Nhưng khi khởi chạy ứng dụng không sử dụng trình quản lý giám sát node hoặc sử dụng forever thì webapp chạy ngon, ok không vấn đề. Khi chuyển sang sử dụng  pm2  thay cho forever thì chết ngóm vì nó show ra 1 cái đường dẫn rất dị /usr/local/lib/node_modules/pm2/public/apps/licensemgr.

pm2 có cơ chế khởi động và giám sát ứng dụng node.js tốt hơn.

Hãy xem cấu trúc thư mục chứa 2 file mã nguồn app.js và test.js:

node-paths

Hãy chạy với đoạn mã nguồn sau đây, giả sử thư mục gốc của chúng ta là: /var/node/test.

pwd
/var/node/test
ls -R
.:
app.js  lib

./lib:
test.js

Hai file: main.js và test.js có nội dung mã nguồn như sau:

app.js

//Execution Path: /var/node/test
//Filename: /var/node/test/app.js

console.log ('*** App Start ***' );
console.log ('module.filename:' + module.filename);
console.log ('__filename:' + __filename);
console.log ('__dirname:' + __dirname);
console.log ('process.cwd ():' + process.cwd());
console.log ('require.main.filename:' + require.main.filename);

console.log ('*** End App***');

console.log ('================================================');
require ('./lib/test');

test.js

//Execution node: /var/node/test
//Filename: /var/node/test/lib/test.js

console.log ('*** App Start ***' );
console.log ('module.filename:' + module.filename);
console.log ('__filename:' + __filename);
console.log ('__dirname:' + __dirname);
console.log ('process.cwd ():' + process.cwd());
console.log ('require.main.filename:' + require.main.filename);

console.log ('*** End App***');

Kết quả thực thi nó phun ra log như sau, ae có thể check để lấy được đường dẫn tương đối của ứng dụng cho phù hợp với cấu hình và nhu cầu của ứng dụng.

node app.js

Kết quả:

*** App Start ***
module.filename:/var/node/test/app.js
__filename:/var/node/test/app.js
__dirname:/var/node/test
process.cwd ():/var/node/test
require.main.filename:/var/node/test/app.js
*** End App***
================================================
*** App Start ***
module.filename:/var/node/test/lib/test.js
__filename:/var/node/test/lib/test.js
__dirname:/var/node/test/lib
process.cwd ():/var/node/test
require.main.filename:/var/node/test/app.js
*** End App***

Hi vọng giúp ích được cho các bạn !

About The Author