Node.js的等效于Rails控制台

55

我正在尝试使用Node.js Express框架,并寻找一个插件,可以让我通过控制台与我的模型交互,类似于Rails控制台。在NodeJS世界中是否有这样的东西?

如果没有,我该如何与我的Node.js模型和数据进行交互,例如手动添加/删除对象,在数据上测试方法等等?

5个回答

73
通过创建一个js文件(例如:console.js)并添加以下行/组件,可以创建自己的REPL:
  1. 要求使用node内置的repl:var repl = require("repl");
  2. 加载所有关键变量,如数据库、任何你信赖的库等。
  3. 使用var replServer = repl.start({});加载repl。
  4. 使用replServer.context.<your_variable_names_here> = <your_variable_names_here>将repl连接到你的关键变量。这使得该变量在REPL(node控制台)中可用/可使用。
例如:如果你的node应用程序中有以下行:var db = require('./models/db'),则请将以下行添加到你的console.js中。
 var db = require('./models/db');
 replServer.context.db = db;
  1. 使用命令 node console.js 运行控制台

您的console.js文件应该类似于这样:
var repl = require("repl");

var epa = require("epa");
var db = require("db");

// connect to database
db.connect(epa.mongo, function(err){
  if (err){ throw err; }

  // open the repl session
  var replServer = repl.start({});

  // attach modules to the repl context
  replServer.context.epa = epa;
  replServer.context.db = db;  
});

你甚至可以像这样自定义你的提示符:
var replServer = repl.start({
  prompt: "Node Console > ",
});

完整的设置和更多细节,请查看: http://derickbailey.com/2014/07/02/build-your-own-app-specific-repl-for-your-nodejs-app/

您可以像提示符、颜色等一样传递 repl 的全部选项列表,请参见: https://nodejs.org/api/repl.html#repl_repl_start_options

感谢 Derick Bailey 提供此信息。


更新:

GavinBelson有一个很好的建议,可以在sequelize ORM中运行(或者任何需要promise处理的东西)。

我现在也在运行sequelize,对于我的node控制台,我正在添加--experimental-repl-await标志。

这是每次输入的内容太多了,所以我强烈建议添加:

"console": "node --experimental-repl-await ./console.js"

到你的package.jsonscripts部分中,这样你就可以直接运行:

npm run console

而不必输入整个命令。

然后,你就可以像这样处理promise而不会出错:

const product = await Product.findOne({ where: { id: 1 });


10
这是对于原帖作者想要做的事情的一个更好的回答。 - Ramses

22

我不是很擅长使用Node,但您可以在命令行中输入node来进入Node控制台。然后我会手动require模型。


11

以下是使用 SQL 数据库的方法:

安装并使用 Sequelize,它是 Node 中对于 Rails Active Record 的 ORM 解决方案。它甚至有一个 CLI 用于模型和迁移的搭建。

node --experimental-repl-await

> models = require('./models'); 
> User = models.User; //however you load the model in your actual app this may vary
> await User.findAll(); //use await, then any sequelize calls here

TLDR

这使您可以像在Rails active record中一样访问所有模型。Sequelize需要一些适应,但从许多方面来说,它实际上比Active Record更灵活,同时具有相同的功能。

Sequelize使用promises,因此要正确运行它们,您需要在运行node时使用--experimental-repl-await标志。否则,您可能会遇到bluebird promise错误。

如果您不想键入require('./models')步骤,则可以使用console.js - 位于您目录的根目录下的REPL设置文件 - 预加载此步骤。但是,我发现在REPL中只需键入这一行更容易。


有没有一种使用Express服务器和Mongoose操作MongoDB的方法来实现它? - August
@august 我不使用Mongoose,但我会尝试相同的概念-将您用于导入mongoose模型的任何导入加载到终端。然后使用它运行查询。 - GavinBelson
似乎这是一种做法。谢谢。 - August

5

很简单:在你的程序中添加一个REPL


你有如何的例子吗? - Mohamed El Mahallawy
5
请具体说明一下,我不理解你的答案。 - João Paulo Motta

4

这可能不能完全回答你的问题,但需要澄清的是,Node.js比Rails更底层,因此不像Rails那样定义工具和数据模型。它更像是一个平台而不是框架。

如果你正在寻找更类似于Rails的体验,可以考虑使用基于Node.js构建的更“全面”的框架,例如Meteor等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接