首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node.js Syslog服务器记录到MS-SQL数据库

node.js Syslog服务器记录到MS-SQL数据库
EN

Code Review用户
提问于 2014-01-10 00:21:35
回答 1查看 1.5K关注 0票数 4

这43行程序旨在侦听端口514上的Syslog消息,并将消息记录到messages数据库表中。

我希望有经验的node.js开发人员提供反馈。

我才刚开始学习node.js。我在JavaScript很普通,仍然对闭包不屑一顾。我真的很难理解node.js事件驱动的编程范式。

如果我试图在sql.open回调函数之外访问SQL server连接,则会得到数据库连接已关闭的错误。

因此,由于这个原因,我不得不将接收消息保存在sql.open回调函数中的数据库逻辑中,这似乎很混乱,而且有违直觉,但这可能是因为我对事件驱动模型不太了解?

无论如何,代码都能工作(令人惊讶!)而且似乎相当有效,每秒将数十条syslog消息保存到本地MS数据库,CPU影响可忽略不计。

该代码中是否存在任何基本缺陷,以及需要对其进行任何修改以改进它?

我想我很惊讶这可以在一页代码中完成。node.js很酷..。

代码语言:javascript
复制
var dgram = require("dgram");
var server = dgram.createSocket("udp4");
var sql = require('msnodesql');

var conn_str = "Driver={SQL Server Native Client 11.0}; Server=.; Database=SYSLOG; UID=xxxxxxx; PWD=xxxxxxxx;";

// open the database connection
sql.open(conn_str, function (err, conn) {
    if (err) {
        console.log("error", err);
        return;
    }
    //database connection succeeded, log a mesage into the syslog.incoming table
    conn.queryRaw("insert into Incoming(Source,Message) values('LOCAL','node.js syslog server started')");

    //create an event listener for when a syslog message is recieved
    server.on("message", function (msg, rinfo) {
      //sanitise the data by replacing single quotes with two single-quotes
      var message = msg.toString().replace(/'/g, "''") 
      var src = rinfo.address.toString().replace(/'/g, "''")
      var s = "insert into Incoming(Source,Message) values('"+src+"','"+message+"')";

      //send the SQL to the database
      conn.queryRaw(s, function (err, results) {
        if (err) {
            console.log(s);
            console.log(err);
            return;
        }
      });
    }); // end of server.on("message") listener

    //create an event listener to tell us that the has successfully opened the syslog port and is listening for messages
    server.on("listening", function () {
      var address = server.address();
      console.log("server listening " + address.address + ":" + address.port);  

    });

    //bind the server to port 514 (syslog)
    server.bind(514);

});// end of sql.open()
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-12-03 17:07:31

从一次又一次:

  • 注释应该值得占用空间,我最喜欢的违反者是: //打开数据库连接sql.open(conn_str,函数(err,conn) ){
  • 我想指一下姆斯诺德斯卡还能维持吗?
  • 我还想指出,在脚本中存储uid/pwd可能很危险,我希望这不是一个没有敏感数据的生产数据库。
  • 正如纳尔逊·梅内泽斯所提到的,你应该考虑使用预先准备好的语句。
  • 在这个块中,要么使用一个逗号分隔的var,要么使用分号: var message = msg.toString().replace(/'/g,“‘”) var src = rinfo.address.toString().replace(/'/g,“’”) var S=“插入传入(Source,Message)值(‘+src+’,‘+message+’)”;
  • 在这样大的脚本中,我会考虑合并一些语句,这个console.log(s);console.log(err);some;可能是well console.log(s,‘n’,err);
  • });// end of sql.open() <-过高注释

总之,这是一个完整的剧本。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/38951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档