我正在试图弄清楚如何构建我的应用程序以使用MySQL最有效的方式.我正在使用node-mysql模块.这里的其他线程建议使用连接池,所以我设置了一个小模块mysql.js
var mysql = require('mysql');
var pool = mysql.createPool({
host : 'localhost',
user : 'root',
password : 'root',
database : 'guess'
});
exports.pool = pool;
Run Code Online (Sandbox Code Playgroud)
现在每当我想查询mysql时,我需要这个模块,然后查询数据库
var mysql = require('../db/mysql').pool;
var test = function(req, res) {
mysql.getConnection(function(err, conn){
conn.query("select * from users", function(err, rows) {
res.json(rows);
})
})
}
Run Code Online (Sandbox Code Playgroud)
这是好方法吗?我真的找不到太多使用mysql连接的例子,除了非常简单的例子,其中一切都在主app.js脚本中完成,所以我真的不知道什么是约定/最佳实践.
我应该在每次查询后总是使用connection.end()吗?如果我在某个地方忘了怎么办?
如何重写我的mysql模块的导出部分只返回一个连接,所以我不必每次都写getConnection()?
如果我有枚举
[Flags]
public enum GameFlow
{
Normal = 1,
NormalNoMove = 2,
Paused = 4,
Battle = 8
}
Run Code Online (Sandbox Code Playgroud)
是否可以通过一次检查来检查枚举是否处于任何一种所需状态?例如,如果我想检查枚举是Normal还是NormalNoMove,我是否总是要像这样写?
if(Flow == GameFlow.Normal || Flow == GameFlow.NormalNoMove)
Run Code Online (Sandbox Code Playgroud)
如果只有两个值但是会有更多的枚举状态,这不是一个大问题,如果我只需要在一个地方改变它就会很好.如果枚举值是Normal或NormalNoMove,是否有可能使枚举别名返回true?或者我是否必须编写某种辅助方法来实现(扩展方法?)
我正在使用标准配置的sockjs.
var ws = sockjs.createServer();
ws.on('connection', function(conn) {
conn.on('data', function(message) {
wsParser.parse(conn, message)
});
conn.on('close', function() {
});
});
var server = http.createServer(app);
ws.installHandlers(server, {prefix:'/ws'});
server.listen(config.server.port, config.server.host);
Run Code Online (Sandbox Code Playgroud)
wsParser.parse 功能是这样的:
function(conn, message) {
(...)
switch(message.action) {
case "titleAutocomplete":
titleAutocomplete(conn, message.data);
break;
(...) // a lot more of these
}
Run Code Online (Sandbox Code Playgroud)
在switch中调用的每个方法都会向客户端发送一条消息.
var titleAutocomplete = function(conn, data) {
redis.hgetall("titles:"+data.query, function(err, titles){
if(err) ERR(err);
if(titles) {
var response = JSON.stringify({"action": "titleAutocomplete", "data": {"titles": titles}});
conn.write(response);
}
})
};
Run Code Online (Sandbox Code Playgroud)
现在我的问题是我想为我的代码进行测试(比我猜的更好),我不知道该怎么做.我开始用mocha + supertest编写正常的http测试,但我只是不知道如何处理websockets.
我希望只有一个websocket连接可以通过所有测试重用,我在第一个消息之后将websocket连接与用户会话绑定,我也想测试该持久性.
如何利用ws客户端的onmessage事件并在我的测试中使用它?测试如何分辨收到的消息并知道他们应该等待哪一个?
我正在使用apache + passenger
<VirtualHost *:80>
RailsEnv production
ErrorLog /home/rails/project_error.log
CustomLog /home/rails/project_access.log combined
DocumentRoot /home/rails/project/public
<Directory /home/rails/project/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
它在开发中工作得很好,但是当我切换到生产时我得到了很有名的"我们很抱歉,但出了点问题." 文本.
奇怪的是development.log没有显示任何错误.如果我预先编译资产或进行数据库迁移,那么它全部放在日志文件中但没有500错误.我有
config.log_level = :debug
Run Code Online (Sandbox Code Playgroud)
在production.rb
project_error.log也为空,错误记录在projest_access.log中
[31/May/2012:22:22:35 +0200] "GET / HTTP/1.1" 500 393 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0"
Run Code Online (Sandbox Code Playgroud)
这次我搞砸了什么?