以编程方式停止MongoDB

时间:2016-09-06 16:03:47

标签: javascript node.js mongodb electron

我正在使用Node.JS,Electron开发应用程序。该应用程序将运行自己的MongoDB实例。 Mongo的启动正在使用以下代码:

child = childProcess.exec(`mongod --dbpath ${appConfig.dbConfigPath}`);

但是,当用户退出程序时,我想停止mongo。我尝试了以下内容,全部取自MongoDB Documentation

child = childProcess.exec('mongod --shutdown');

child = childProcess.exec(`kill -2 ${child.pid}`);

但这些都没有关闭这个过程。

正在开发此应用程序以在Windows平台上运行。

为清楚起见,这是我的应用配置文件。 init()函数从我的main.js中执行。 shutdown()在windowMain.on中执行('关闭')。

calibration.js

'use strict';

const childProcess = require('child_process');

const fileUtils = require('./lib/utils/fileUtils');
const appConfig = require('./config/appConfig');

let child;

class Calibration {
    constructor() {}

    init() {
        createAppConfigDir();
        createAppDataDir();
        startMongo();
    }

    shutdown() {
        shutdownMongo();
    }
}

function createAppConfigDir() {
    fileUtils.createDirSync(appConfig.appConfigDir);
}

function createAppDataDir() {
    fileUtils.createDirSync(appConfig.dbConfigPath);
}

function startMongo() {
    child = childProcess.exec(`mongod --dbpath ${appConfig.dbConfigPath}`);
    console.log(child.pid);
}

function shutdownMongo() {
    console.log('inside shutdownMongo');
    //This is where I want to shutdown Mongo
}

module.exports = new Calibration();

main.js

'use strict'

const { app, BrowserWindow, crashReporter, ipcMain: ipc } = require('electron');
const path = require('path');

const appCalibration = require('../calibration');

appCalibration.init();

const appConfig = require('../config/appConfig');

let mainWindow = null;

ipc.on('set-title', (event, title) => {
    mainWindow.setTitle(title || appconfig.name);
})

ipc.on('quit', () => {
    app.quit();
})

// Quit when all windows are closed.
app.on('window-all-closed', function() {
    if (process.platform != 'darwin') {
        app.quit();
    }
});

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
app.on('ready', function() {

    // Create the browser window.
    mainWindow = new BrowserWindow({ center: true });

    mainWindow.maximize();

    mainWindow.setMinimumSize(770, 400);

    mainWindow.loadURL(path.join(`file://${__dirname}`, '../ui/index.html'));

    mainWindow.on('close', () => {
        console.log('Inside quit')
        appCalibration.shutdown();
        app.quit();
    });

    mainWindow.on('closed', function() {
        mainWindow = null;
    });
});

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用Ipc通过js文件发送订单。

在您定义电子的main.js中,您可以这样说:

ipcMain.on("shutDownDatabase", function (event, content) {
    // shutdown operations.
});

然后在应用程序代码的某些部分中,您可以添加如下函数:

function sendShutdownOrder (content){
   var ipcRenderer = require("electron").ipcRenderer;
   // the content can be a parameter or whatever you want that should be required for the operation.
   ipcRenderer.send("shutDownDatabase", content);
}

另外我认为你可以使用Electron的事件来关闭你的数据库,这会监听你启动电子时创建的mainWindow的事件

    mainWindow.on('closed', function () {
        // here you command to shutdowm your data base.
        mainWindow = null;
    });

有关IPC的更多信息,您可以看到here以及有关窗口事件的信息here

答案 1 :(得分:1)

根据保罗·加尔多·桑多瓦尔的建议,我能够让它发挥作用。但是,我需要从Windows任务管理器获取mongod的PID。为此,我将以下函数添加到应用程序配置js文件

function getTaskList() {
    let pgm = 'mongod';

    exec('tasklist', function(err, stdout, stderr) {
        var lines = stdout.toString().split('\n');
        var results = new Array();
        lines.forEach(function(line) {
            var parts = line.split('=');
            parts.forEach(function(items) {
                if (items.toString().indexOf(pgm) > -1) {
                    taskList.push(items.toString().replace(/\s+/g, '|').split('|')[1])
                }
            });
        });
    });
}

我还声明了一个数组变量来放置定位的PID。然后我更新了我的关闭函数

function shutdownMongo() {
    var pgm = 'mongod';

    console.log('inside shutdownMongo');

    taskList.forEach(function(item) {
        console.log('Killing process ' + item);
        process.kill(item);
    });
}

有了这个,我现在能够启动和停止Mongo,因为我的应用程序启动并关闭。

全部谢谢