Javascript node.js/express应用程序-数据库连接逻辑放在哪里?

Javascript node.js/express应用程序-数据库连接逻辑放在哪里?,javascript,node.js,model,redis,node-redis,Javascript,Node.js,Model,Redis,Node Redis,背景信息 我刚刚创建了我的第一个express应用程序。我可以看到它创建了一堆文件和默认文件夹结构。这就是我的应用程序结构当前的样子: me@mydevbox:/var/www/html/nodejs_samples/tutorial1$ ls -lah total 36K drwxr-xr-x 7 me me 4.0K Sep 28 09:26 . drwxrwxr-x 5 me me 4.0K Sep 28 08:45 .. -rw-rw-r-- 1 me me 1.5K Sep 28

背景信息

我刚刚创建了我的第一个express应用程序。我可以看到它创建了一堆文件和默认文件夹结构。这就是我的应用程序结构当前的样子:

me@mydevbox:/var/www/html/nodejs_samples/tutorial1$ ls -lah
total 36K
drwxr-xr-x  7 me me 4.0K Sep 28 09:26 .
drwxrwxr-x  5 me me 4.0K Sep 28 08:45 ..
-rw-rw-r--  1 me me 1.5K Sep 28 08:45 app.js
drwxr-xr-x  2 me me 4.0K Sep 28 09:20 bin
drwxrwxr-x 96 me me 4.0K Sep 28 09:26 node_modules
-rw-rw-r--  1 me me  352 Sep 28 09:26 package.json
drwxr-xr-x  5 me me 4.0K Sep 28 08:45 public
drwxr-xr-x  2 me me 4.0K Sep 28 09:26 routes
drwxr-xr-x  2 me me 4.0K Sep 28 08:45 views
me@mydevbox:/var/www/html/nodejs_samples/tutorial1$ 
me@mydev:/var/www/html/nodejs_samples/tutorial1$ cat routes/widgets.js 
var express = require('express');
var router = express.Router();

/* GET widgets listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

module.exports = router;
目标

我想创建一个名为“widgets”的新路由,当调用GET方法时,我需要调用redis数据库并执行查询。 我要用于触发此get的URL如下所示:

  http://myserver/tutorial1/widgets/

其中12345是我要查询的小部件键

我到目前为止所做的事情

我找到了一个解释如何连接/查询redis数据库的文档:

我还将express generator为我“免费”创建的routes/users.js复制到routes/widgets.js作为起点

这就是我的routes/widgets.js文件的样子:

me@mydevbox:/var/www/html/nodejs_samples/tutorial1$ ls -lah
total 36K
drwxr-xr-x  7 me me 4.0K Sep 28 09:26 .
drwxrwxr-x  5 me me 4.0K Sep 28 08:45 ..
-rw-rw-r--  1 me me 1.5K Sep 28 08:45 app.js
drwxr-xr-x  2 me me 4.0K Sep 28 09:20 bin
drwxrwxr-x 96 me me 4.0K Sep 28 09:26 node_modules
-rw-rw-r--  1 me me  352 Sep 28 09:26 package.json
drwxr-xr-x  5 me me 4.0K Sep 28 08:45 public
drwxr-xr-x  2 me me 4.0K Sep 28 09:26 routes
drwxr-xr-x  2 me me 4.0K Sep 28 08:45 views
me@mydevbox:/var/www/html/nodejs_samples/tutorial1$ 
me@mydev:/var/www/html/nodejs_samples/tutorial1$ cat routes/widgets.js 
var express = require('express');
var router = express.Router();

/* GET widgets listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

module.exports = router;
问题

我不清楚应该在哪里添加数据库连接逻辑和查询逻辑。我习惯于MVC,在MVC中,您可以将所有数据库逻辑拆分为模型

我可以将所有内容都放在route/widgets.js文件中吗

如果有帮助,这里有一个指向我的app.js文件的链接:。我添加了两行-第10行和第28行


任何建议或良好的教程链接将不胜感激

简单的回答是肯定的,MVC工作得很好,数据库的东西当然可以进入模型中

但是,给猫剥皮的方法有很多。在这一点上,有些琐碎的东西,我认为你应该做一些对你来说很方便的事情,感觉像是一个相当干净的设计

问题是,随着您的系统变得越来越复杂,您需要一种方法来平滑地发展它。你永远不会有最终的“最佳”设计,因为现实随着你的前进而改变

请务必首先查看node-modules.com、npmjs.com和npms.io,以探索已经实施和流行的许多(而且非常多样化)强大的设计

如果有时间,我认为您应该探索多种不同的策略来组织代码

然而,更大的问题是,在不完全破坏应用程序(并且不知道它)的情况下,如何可能在将来更改此设计(您最终会希望更改它)

因此,我认为与其现在为代码组织而苦恼太多,不如花点精力想出尽可能多的自动测试方法。这样,当您更改设计时,您将能够看到哪些损坏了,因此更改设计是可行的

在实际情况下,您需要单元测试,否则需要集成测试,更大规模的端到端测试


如果你能把一些东西放进它自己的模块/模型文件/任何东西中,并将其作为一个单元单独测试,那么这可能比其他设计更好。

简单的回答是肯定的,MVC工作得很好,数据库的东西当然可以进入模型中

但是,给猫剥皮的方法有很多。在这一点上,有些琐碎的东西,我认为你应该做一些对你来说很方便的事情,感觉像是一个相当干净的设计

问题是,随着您的系统变得越来越复杂,您需要一种方法来平滑地发展它。你永远不会有最终的“最佳”设计,因为现实随着你的前进而改变

请务必首先查看node-modules.com、npmjs.com和npms.io,以探索已经实施和流行的许多(而且非常多样化)强大的设计

如果有时间,我认为您应该探索多种不同的策略来组织代码

然而,更大的问题是,在不完全破坏应用程序(并且不知道它)的情况下,如何可能在将来更改此设计(您最终会希望更改它)

因此,我认为与其现在为代码组织而苦恼太多,不如花点精力想出尽可能多的自动测试方法。这样,当您更改设计时,您将能够看到哪些损坏了,因此更改设计是可行的

在实际情况下,您需要单元测试,否则需要集成测试,更大规模的端到端测试


如果您可以将某些内容放入其自己的模块/模型文件/任何内容中,并将其作为一个单元单独进行测试,那么这可能比其他设计更好。

您可以这样做,但它直接耦合到路由处理程序。这样开始很好,但我更喜欢将关注点分开。最终,这归结为观点:没有一种特定的“正确”方式来分解功能。你可以,但它直接耦合到路由处理程序。这样开始很好,但我更喜欢将关注点分开。归根结底,这可以归结为一种观点:没有一种特定的“正确”方式来分解功能。我非常喜欢你的建议。将代码划分为可测试单元对我来说是一个很好的总体原则。我想我要做的是把所有的东西都放到特定的路由文件中。。。只是为了学习和表达。。。一旦我熟悉了它。。。也许戴上测试帽,重新审视我的示例代码,看看哪种重构最能支持测试。我非常喜欢你的建议。将代码划分为可测试单元对我来说是一个很好的总体原则。我想我要做的是把所有的东西都放到特定的路由文件中。。。只是为了学习和表达。。。一旦我熟悉了它。。。也许戴上测试帽,重新审视我的示例代码,看看哪种重构最能支持测试。