使用Node.JS中的乏味和承诺以正确的顺序解析和插入记录

时间:2018-07-25 17:29:11

标签: sql-server node.js q tedious

我有一个解析应用程序,该应用程序通过TCP连接到计算机,并等待从计算机发送数据。发送数据后,我必须解析消息以正确组织SQL表的内容。当前,机器可能会发送多行消息,每条消息都具有四个组成部分的有效负载,或者它们可能会发送带有四分量有效载荷的单行消息。

当前必须以正确的顺序插入记录,以便以后针对数据库运行的自动化任务。不幸的是,当多行消息进入并被解析时,记录经常以随机顺序插入。我可以引入一些排队功能来确保按顺序插入事物吗?

我的代码的简化示例如下:

收集数据:

clients[i].on('data', function(data) {
  console.log("Data: " + data + " " + hosts[j]);
    parse_message(data, hosts[j][1], hosts[j][2]);
});

解析字符串和有效负载组件:

function parse_message(data, m_id, type) {
   //console.log('Message received = ' + data);
   var msg = data.toString('utf8'); // Convert from object class, split CRs
   var strings = msg.split('\r\n'); // split multi-line data
   console.log("Strings: " + strings)
   strings.forEach(function(element) {
   var payload = element.split("///"); // split by separator
   if (payload.length == 4) { // If array is properly formed
   payload[3] = payload[3].trim();
   if (payload[3].includes('N')) {
     payload[3] = payload[3].slice(1, payload[3].length);
   }
   payload[4] = m_id; // Send machine ID
   payload[5] = dt.getDateTime();
   if (type == 'Machine') {
       Insert_Machine(payload);
     }
     else if (type == 'Pallet') {
           Insert_Pallet(payload);
         }
         else {
           console.log("Type didn't come through. Where am I supposed to put this?")
         }
       }
     });
}

插入繁琐和承诺:

function Insert_Machine(msg, callback) {
  var result = [];
  var deferred = q.defer(); // init promise
  var connection = new Connection(machine_config);
  connection.on('connect', function(err) {
    var request = new Request( // set up request structure
        'INSERT INTO dbo.Data_new (pp_id, d_No, d_Note, d_Data, d_seq, d_machine, d_DateTime) OUTPUT INSERTED.Id VALUES (@pp_id, @d_No, @d_Note, @d_Data, 0, @d_machine, @d_DateTime);',
        function(err, rowCount) {
          if (err) {
            console.log(err); // print error on console if anything happens
          }
          else {
            console.log(rowCount + ' rows inserted to Machine_Data: ' + msg); // confirm the insert
          }
          deferred.resolve(result); // resolve promise
        });
        request.on('row', function(columns){
          result.push(columns);
        });
    request.addParameter('pp_id', TYPES.NVarChar, msg[0]);
    request.addParameter('d_No', TYPES.NVarChar, msg[1]);
    request.addParameter('d_Note', TYPES.NVarChar, msg[2]);
    request.addParameter('d_Data', TYPES.NVarChar, msg[3]);
    request.addParameter('d_machine', TYPES.NVarChar, msg[4]);
    request.addParameter('d_DateTime', TYPES.NVarChar, msg[5]);

    // Execute SQL statement
    connection.execSql(request);
  }
);
return deferred.promise;
}

0 个答案:

没有答案