小编kas*_*lan的帖子

node.js + mysql连接池

我正在试图弄清楚如何构建我的应用程序以使用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()?

mysql node.js

66
推荐指数
4
解决办法
9万
查看次数

检查枚举是否处于所需状态之一

如果我有枚举

    [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?或者我是否必须编写某种辅助方法来实现(扩展方法?)

c# enums

9
推荐指数
3
解决办法
7055
查看次数

如何测试node.js websocket服务器?

我正在使用标准配置的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事件并在我的测试中使用它?测试如何分辨收到的消息并知道他们应该等待哪一个?

unit-testing mocha.js websocket node.js sockjs

6
推荐指数
1
解决办法
5695
查看次数

rails 3.2我们很抱歉,但生产出了问题.日志文件不记录错误

我正在使用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)

这次我搞砸了什么?

ruby-on-rails-3

1
推荐指数
1
解决办法
4493
查看次数