提问者:小点点

node.js监视文件夹并运行脚本


在我的项目中,我使用PM2重新启动node.js,它工作得很好。

但是,我需要观察文件夹的变化,启动脚本,而不是在退出后重新启动它。

为了简单起见,我对i18n使用yml。我的目标是,当我在yml文件中进行更改时,运行脚本将其转换为json,仅此而已。等待yml文件中的新更改。

PM2可以工作,但它在每次退出后一次又一次地尝试重新启动脚本。

id为[1]且pid为[28803]的PM2应用程序[i18n compile]通过信号[SIGINT]PM2脚本/HOME/.../SRC/i18n/convert.js退出,代码为[0]。停止了。“错误”

也许我应该用另一个工具来解决这个问题?


共2个答案

匿名用户

nodemon是一个工具,允许您对目录中的文件进行更改并自动运行脚本

nodemon可以通过npm安装-g nodemon安装

当对script.js或对与script.js相同目录中的任何其他文件进行更改时,执行nodemon script.js将自动运行node script.js

匿名用户

我提醒自己,生活在异步环境中:

  1. 写道自己的观察家。
  2. 将区域设置目录添加到主应用程序中的PM2 ignore_watch
  3. 将“我的观察者”添加为PM2.5应用程序,但“观察”仅添加到“观察者”。
{
  name         : 'I18n compiler',
  interpreter  : 'babel-node',
  script       : 'tools/locales.watcher.js',
  cwd          : path.root,
  watch        : 'tools/locales.watcher.js',
  ignore_watch : ['config', 'src', 'server', 'package.json'],
  env: {
    NODE_PATH: path.src,
    NODE_ENV: 'development'
  },
}
import fs      from 'fs';
import config  from '../config/general';
import convert from 'i18n/convert.js';

const { path } = config;

 // Synchronous recursively list files in a directory
function getFilesRecur(dir, filelist) {
  const files = fs.readdirSync(dir);
  filelist = filelist || [];
  files.forEach(function(file) {
    if (fs.statSync(path.join(dir, file)).isDirectory()) {
      filelist = getFilesRecur(path.join(dir, file), filelist);
    } else if ((/\.(yml|yaml)$/i).test(file)) {
      filelist.push(path.join(dir, file));
    }
  });
  return filelist;
}

export default function setupLocalesWatcher(){
  const files = getFilesRecur(path.i18n);

  files.forEach(function(file) {
    console.log(`Watching: ${file}`);
    fs.watchFile(file, () => {
      convert(file);
    });
  });

}