【问题标题】:Node.js run MongoDB from within applicationNode.js 从应用程序中运行 MongoDB
【发布时间】:2016-11-07 21:25:52
【问题描述】:

我正在构建一个 NPM 可以使用的组件。应用程序需要连接到数据库。如果用户没有在配置文件中指定数据库 uri 的详细信息,我的应用程序应该从应用程序本身启动一个 mongoDB 实例。

我看过很多关于如何将 mongoDB 集成到 node.js、express、mocha 和许多其他库中的教程,但都连接到已经运行的外部数据库。

mongoDB 服务器作为依赖项的一部分包含在内,因此与其他所有内容一起安装,但我在网上缺少关于如何在应用程序启动时启动数据库的材料。

任何帮助将不胜感激。我怀疑信息就在那里,但我很难找到它:(

【问题讨论】:

  • 数据库在逻辑上是一个独立的应用程序,将你的节点应用程序和 mongodb 应用程序分开实际上很好,让它们“松散”耦合。为没有指定配置文件的用户创建一个新的 mongo db 服务器不是一个选项吗?您不必实现已经被 mongo db 应用程序更好地实现的东西。
  • 是的,我同意。在几乎没有用户输入的情况下按需安装和创建新的 mongodb 服务器和数据集有多难?只是自定义数据库的配置中的一个标志,如果它不存在,则创建一个新服务器。谢谢
  • 嘿 Nicholas 我根据您在 cmets 中的要求制定了一个答案。祝你好运!

标签: node.js mongodb npm local-database


【解决方案1】:

您可以考虑启动subprocess。所以让 Node 作为外部程序运行 mongo。这样,您可以为符合该条件的任何用户创建一个新的 mongodb 实例。例如,您可以使用节点"child process" 库并使用spawn 函数通过在此处编写Larry Turtis 或此处mongodb - multiple instances 所述的控制台命令来“生成”一个新的数据库实例。启动实例可能如下所示:

const spawn = require('child_process').spawn;
const pipe = spawn('mongod', ['--dbpath=<LOCATION>', '--port', '<PORT>'])

您可以使用以下命令将控制台输出通过管道传输到节点:

    pipe.stdout.on('data', function (data) {
        printback(data.toString('utf8'));
    });

    pipe.stderr.on('data', (data) => {
        printback(data.toString('utf8'));
    });

    pipe.on('close', (code) => {
        callback('Process exited with code: '+ code);
    });

并通过保留管道引用杀死 mongodb 运行实例,然后执行以下操作:

static end_pipe(pipe) {
    pipe.kill('SIGINT');
}

【讨论】:

【解决方案2】:

NPM mongodb page 上提供了启动 mongoDB 的命令。添加--fork--logpath 因为我假设您希望它在后台启动。

mongod --dbpath=/data --port 27017 --fork --logpath /var/log/mongod.log

您可以将其作为 npm 启动脚本的一部分包含在 package.json 中:

"scripts": {"start": "mongod --dbpath=/data --port 27017 --fork --logpath /var/log/mongod.log"}

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2012-12-31
    • 2023-03-08
    • 2018-02-03
    • 1970-01-01
    相关资源
    最近更新 更多