注意:请在回答之前阅读本文的编辑部分,这可能会节省您的时间并回答我的一个问题.
我遇到的问题非常简单,但我对这个问题很陌生,而且我在解决如何在节点/快速应用程序中正确实现mongodb数据库连接时遇到了问题.
我正在使用express 3.x并且我的应用程序布局基于这个项目由express的作者提供:https: //github.com/visionmedia/express/tree/master/examples/blog
我没有兴趣创建一个博客,但应用程序结构的方式似乎相当不错.路线是分开的,一切都很好地组织.
我的问题是我可能有5-6个不同的路由js文件,每个路由js文件可能有1到15个路由之间的任何地方; 那些路由1或15可能想要访问数据库.
所以我的问题是,每次我想查询数据库时,做一个db.open(...)似乎是一个非常可怕的想法.我现在应该提一下我使用的是本机mongo-db驱动程序(npm install mongodb).
我还需要包含这样一个文件:http: //pastebin.com/VzFsPyax
...在所有这些路径文件和我的所有模型文件中.然后我还要处理几十个打开的连接.
有没有办法我可以这样的方式构建我的应用程序,我只进行1次连接,并在会话期间保持打开状态(有一个新的,每个请求也会很糟糕)?
如果是这样,我该怎么做?如果您知道答案,请使用tj的博客应用程序(本文前面链接的那个)结构作为基本指南发布代码示例.基本上有一种方法,路由和模型可以自由地使用数据库,而不是数据库开放代码.
谢谢.
编辑
我在解决我的一个问题上取得了一些进展.如果你看看tj的博客示例,他会在app.js中初始化他的路线,如下所示:
require('./routes/site')(app);
require('./routes/post')(app);
Run Code Online (Sandbox Code Playgroud)
在路径js文件中,它像这样开始:
module.exports = function(app){
Run Code Online (Sandbox Code Playgroud)
我偶然发现了今天早些时候的一个项目,我看到有人在modules.exports调用 - > function(app,db)中传递了2个变量.然后想到哇可能就这么简单,我还需要调整我的路线(app,db)吗?是的,似乎是这样.
所以现在问题的第1部分已经解决了.我不需要在每个路由文件中都需要带有连接样板的mongo.js文件.同时它足够灵活,我可以决定选择哪个路由文件传递db引用.这是标准的,没有任何缺点吗?
问题的第2部分(不幸的是重要的)仍然存在.
如何围绕我所做的每个查询绕过必须执行db.open(...),理想情况下每个会话只进行一次连接?
我一直在关注这篇文章与工头设置美洲狮:
美洲狮脚本verify_active_connections!在连接之后说,但它在轨道4中不可用.注释掉方法调用将使脚本运行,但我不确定这是否会泄漏资源.
我能看到的关于这个问题的唯一文档是:
https://github.com/socialcast/resque-ensure-connected/issues/3
但对于该做什么没有确凿的答案.我认为选项可以省略它,rails会在引擎盖下处理它,或者每个运行的块验证每个块.有没有人真正回答该怎么做?谢谢.
我正在研究如何解决这个问题.我有2个表格需要彼此相邻显示,但你不能嵌入表格,我只是把第二个表格放在第一个表格之后.
但是,rails忽略<% end %>了第二个表单的标签,它在需要关闭之前自动关闭第二个表单.这使我的表格不起作用.
为简洁起见,这里省略了一些位.
<div class="row">
<div class="col-md-3">
<div class="well">
<%= render "shared/some_form", url_path: foo_path %>
<%= form_tag some_other_path, method: :delete, id: "form_bulk_action", role: "form" do %>
<div id="bulk_action_group">
<div class="form-group">
<%= label_tag "perform_bulk_action", "For each checked item" %>
<%= select_tag "perform_bulk_action", options_for_select([ ["Delete", "destroy"] ]), class: "form-control" %>
</div>
<%= button_tag id: "foo" %>
</div>
</div>
</div>
<div class="col-md-9">
<table class="table table-condensed table-hover">
<thead>
<tr>
<th><%= check_box_tag :check_all_data_rows, "", false %></th>
</tr>
</thead>
<tbody>
<% @foo.each …Run Code Online (Sandbox Code Playgroud) 这是涉及单页网页应用的问题,我的问题是粗体.
警告:我不是这方面的专家,如果我对我对HTTP和WebSockets的工作原理有所了解,请纠正我.
我对HTTP restful API如何工作的理解是它们是无状态的.我们使用connect.session()等工具将某种类型的状态插入到更高级别的应用程序中.由于每个请求都是新的,我们需要一种方法来重新识别自己的服务器,因此我们创建了一个来回发送的唯一令牌.
Connect的会话中间件以非常酷的方式为我们解决了这个问题.将它放入您的中间件堆栈中,您可以为整个应用程序的每个请求附加精彩的会话.撒上一些握手,你可以很容易地将会话信息传递给socket.io,甚至更加精彩.使用RedisStore来保存信息以将其与您的连接/快速应用程序分离,它甚至更加精彩.我们在这里谈论双彩虹真棒.
所以现在你理论上可以有一个不依赖于连接/会话的单页面应用程序,因为在处理websockets时你不需要超过1个会话(初始握手).socket.io已经让你轻松访问这个sessionId,问题解决了.
而不是此身份验证工作流程:
它现在变成:
通过使用connect,我们还能从中受益?这是我常用的清单:
加载初始单页面应用程序的代码将处理设置静态服务器和图标.像护照这样的东西可能会更难实施,但肯定不是不可能的.我列出的其他所有内容都无关紧要,您可以轻松地为websockets实现自己的调试记录器.
现在是否真的有什么阻止我们使用一个基于http的index.html文件来封装websocket连接并且根本不依赖于连接?如果你想要一个单页应用程序同时通过其自动神奇的后备提供跨浏览器支持,socket.io真的能够使这种类型的应用程序架构无需设置你自己的HTTP restful API吗?
在这一点上唯一真正的缺点是在客户端上缓存结果吗?你不能为此加入本地存储吗?我认为为搜索引擎创建可索引/可抓取的内容页面并不是什么大不了的事 - 你基本上会创建一个从持久数据库创建静态html文件的工具吗?
是否存在分支/维护的主干版本,完全不需要jquery或zepto来同时使用路由器和视图?
我不介意使用主干但是没有办法我会强制jquery依赖我的页面只是为了使用它.
如果某个解决方案不存在,有人可以发布一个需要更改的内容吗?
我最近一直在 Go 中缓存 http 响应,我正在尝试找出生成正确 ETag 的最有效方法。
现在我有以下可用数据:
经过一番思考后,我得出的结论是,如果我将模板的名称和生成的动态数据结合起来,理论上应该会以最少的开销创建一个合法的唯一 ETag,但我不知道如果我开始想要返回 30kb 的 html 数据库结果。
我使用 Go 的 stdlib 中的 crc32 例程根据传递给它的数据生成 ETag。
有没有更好的方法来生成 ETag,甚至缓存动态数据?我不能只监视文件的最后修改时间,因为数据可以在文件不更改的情况下更改。
我很难确定如何使用assert_select或assert_tag确保元标题的content属性不为空.我无法弄清楚如何让它一起工作.
为了给你一个更好的主意,这是一个我希望测试工作的例子:
这应该通过:
[meta name ="title"content ="Hello"/]
这应该失败:
[meta name ="title"content =""/]
[注意:根本没有标签也应该失败]
我已经设置了allauth并注意到它暴露/accounts/password/change/了一个可爱的表单来更改当前登录用户的密码.它还公开/accounts/email/了处理与将电子邮件地址链接到帐户相关的所有疯狂的奇妙之处.
我的问题是:
如何创建一个/accounts/settings/页面的概念,作为用户的典型设置页面,以便他们可以编辑他们的名称,更改他们的电子邮件信息或通过1个模板更新他们的密码?
我相信第一步是创建一个settings应用程序,然后连接一个/accounts/settings受登录保护的路由,创建一个视图来处理一个表单提交并显示allauth提供的其他模板,但我只是不确定如何将所有内容放在一起视图级别.
我认为在这个页面上有(3)单独的表格可能是个好主意.一个用于更改密码,第二个用于处理allauth提供的所有电子邮件业务,最后一个用于处理自定义信息,例如更新其名称以及您在扩展用户模型中可能拥有的任何其他内容?
我已成功在我的Express/Mongoose网络应用程序中实现了本地护照,但我无法确定如何正确呈现失败的登录消息.
这是我的登录路线:
app.get('/login', function(req, res) {
res.render('user/login', {
});
});
Run Code Online (Sandbox Code Playgroud)
有了这样的路线我该怎么报告无效登录?如果登录成功,将写id/ username到req.user对象,但并不能帮助我的"GET /login"路线,因为如果成功,你会重定向到你想去的页面.
这意味着req.user将始终undefined在您GET登录页面时.
我希望能够写出一条消息,上面写着'哟,登录无效!' 当发生以下事情时:
我可能希望根据发生的情况输出不同的消息.
当我实现LocalStrategy时,我使用了以下代码:
passport.use(new LocalStrategy({
usernameField: 'email'
},
function(email, password, fn) {
User.findOne({'login.email': email}, function(err, user) {
// Error was thrown.
if (err) {
return fn(err);
}
// User does not exist.
if (!user) {
return fn(null, false);
}
// Passwords do not match.
if (user.login.password != utility.encryptString(user.login.salt + password)) …Run Code Online (Sandbox Code Playgroud) express ×3
node.js ×3
ruby ×2
activerecord ×1
assert ×1
attributes ×1
backbone.js ×1
caching ×1
client-side ×1
connect ×1
database ×1
django ×1
django-forms ×1
erb ×1
forms ×1
go ×1
html ×1
http ×1
http-headers ×1
javascript ×1
jquery ×1
mongodb ×1
mongoose ×1
passport.js ×1
puma ×1
socket.io ×1
testing ×1
websocket ×1