将单个协同函数放入类中时的问题

时间:2016-08-10 18:57:26

标签: node.js

所以我的功能很好。

这里是上下文的代码:

"use strict";
//Get the splunk sdk
var splunkjs = require('splunk-sdk');
//get promise dependencies
Promise = require("bluebird");

//get request dependencies
let request = require('request-promise');

exports.splunkQuery = Promise.coroutine(function*(){
  try{
    // Create a Service instance and log in
    let service = Promise.promisifyAll(new splunkjs.Service({
      username:"user",
      password:"pass",
      scheme:"https",
      host:"mysplunk",
      port:"8089",
      version:"6.3.2"
    }));
    // Pass the search query
    let searchQuery = yield Promise.resolve("search index=edex FIDELITY.CCB.LPS.PROD.MORTFILE* PNOD=CD.HNBNOLA RECI=CTRC");
    // Search params (No Idea what these do)
    let searchParams = yield Promise.resolve({
      exec_mode: "blocking"
    });
    //get the job object from splunk
    let job = yield service.searchAsync(searchQuery,searchParams);
    //add the fetchJson function to the job object
    job.fetchJsonAsync = fetchJsonAsync;
    //get the results
    let results = yield Promise.resolve(job.fetchJsonAsync());
    //return the resuling value
    console.log(results.events[0]._raw)
  } catch (e){
    console.log(e)
  }

});




//A function that returns a promise
function fetchJsonAsync(){
  //Create a result object and return it
  var resultsArrayObject = {}
    //return a promise
  return new Promise (function(resolve,reject){
    //display the job id
    console.log("Search job id:         " + this.sid);
    this.results({}, function(err, results) {
      var fields = results.fields;
      var rows = results.rows;
      //Create an array to hold all of the event objects
      var eventsArray = [];
      for(var i = 0; i < rows.length; i++) {
        var values = rows[i];
        //Create an empty object to hold the atributes of an event
        var eventObject = {}
        for(var j = 0; j < values.length; j++) {
          var field = fields[j];
          var value = values[j];
          eventObject[field] = value;
        }
        eventsArray.push(eventObject);
      }
      //populated the results object
      resultsArrayObject["events"]=eventsArray;
    if(err){
      //reject the promise if there is an error
      reject(err);
      console.error(err)
    }else{
      //fulfill the promise
      resolve(resultsArrayObject);
    }
  })

}.bind(this)); //This needs to be binded to this function so that it can get the rest of the functions properly
}

并调用这样的函数:

var test = Promise.coroutine(function*(request,response){
  let result = yield Promise.resolve(splunk.splunkQuery());
  console.log(result);
});

test();

我知道当我将自己的函数添加到搜索查询产生的作业对象时,我可能会做一些粗略的事情,但是它有效。

我想在单个类中将每个步骤分解为单个方法,因为每次我想进行查询时我都不想创建新连接。所以我写了这个:

"use strict";
//Get the splunk sdk
var splunkjs = require('splunk-sdk');
//get promise dependencies
Promise = require("bluebird");

//Create Class
let Splunk = {};

//Define object variables
Splunk._service = {}
Splunk._serviceDetails = {}
Splunk._query = ""
Splunk._searchParameters = {}

//Define object functions
//Set the login information

Splunk.setServiceDetails = function(serviceDetails){
  return new Promise (function(resolve,reject){
    this._serviceDetails = serviceDetails;
    resolve(true)
  }.bind(this));
}

Splunk.getServiceDetails = function(serviceDetails){
  return new Promise (function(resolve,reject){
    resolve(this._serviceDetails)
  }.bind(this));
}

//Start the service
Splunk.startService = function(){
  return new Promise (function(resolve,reject){
    this._service = Promise.promisifyAll(new splunkjs.Service(this._serviceDetails));
    resolve(true)
  }.bind(this));
}

//Start the service
Splunk.getService = function(){
  return new Promise (function(resolve,reject){
    resolve(this._service)
  }.bind(this));
}

Splunk.setQuery = function(query){
  return new Promise (function(resolve,reject){
    this._query = query;
    resolve(true)
  }.bind(this));
}

Splunk.getQuery = function(query){
  return new Promise (function(resolve,reject){
    console.log("Getting Query")
    resolve(this._query)
  }.bind(this));
}

Splunk.setSearchParameters = function (searchParameters){
  return new Promise (function(resolve,reject){
    this._searchParameters = searchParameters;
    resolve(true)
  }.bind(this));
}

Splunk.getSearchParameters = function (searchParameters){
  return new Promise (function(resolve,reject){
    console.log("Getting Search Parameters")
    resolve(this._searchParameters)
  }.bind(this));
}

Splunk.execute = Promise.coroutine(function*(){
  try{
    // Create a Service instance and log in
    let service = yield this.getService();
    // Pass the search query
    let searchQuery = yield this.getQuery();
    // Search params (No Idea what these do)
    let searchParams = this.getSearchParameters();
    //get the job object from splunk
    let job = yield service.searchAsync(searchQuery,searchParams);
    //add the fetchJson function to the job object
    job.fetchJsonAsync = this._fetchJsonAsync;
    //get the results
    let results = yield Promise.resolve(job.fetchJsonAsync());
    //return the resuling value
    return results
  } catch (e){
    console.log(e)
  }

});

Splunk._fetchJsonAsync = function(){
  //Create a result object and return it
  var resultsArrayObject = {}
    //return a promise
  return new Promise (function(resolve,reject){
    //display the job id
    console.log("Search job id:         " + this.sid);
    this.results({}, function(err, results) {
      var fields = results.fields;
      var rows = results.rows;
      //Create an array to hold all of the event objects
      var eventsArray = [];
      for(var i = 0; i < rows.length; i++) {
        var values = rows[i];
        //Create an empty object to hold the atributes of an event
        var eventObject = {}
        for(var j = 0; j < values.length; j++) {
          var field = fields[j];
          var value = values[j];
          eventObject[field] = value;
        }
        eventsArray.push(eventObject);
      }
      //populated the results object
      resultsArrayObject["events"]=eventsArray;
    if(err){
      //reject the promise if there is an error
      reject(err);
      console.error(err)
    }else{
      //fulfill the promise
      resolve(resultsArrayObject);
    }
  })

}.bind(this)); //This needs to be binded to this function so that it can get the rest of the functions properly
}





module.exports = Splunk;

我称之为(我计划在工作后抽象执行顺序):

var test = Promise.coroutine(function*(request,response){
  //let result = yield Promise.resolve(splunk.splunkQuery());
  try{
    yield splunkClass.setServiceDetails({
      username:"user",
      password:"pass",
      scheme:"https",
      host:"mysplunk",
      port:"8089",
      version:"6.3.2"
      });
    console.log("set service details");
    yield splunkClass.startService();
    console.log("started service");
    yield splunkClass.setQuery("search index=edex FIDELITY.CCB.LPS.PROD.MORTFILE* PNOD=CD.HNBNOLA RECI=CTRC");
    console.log("set query async")
    yield splunkClass.setSearchParameters({
      exec_mode: "blocking"
      });
    console.log("set search parameters")
    let result = yield splunkClass.execute()
    console.log("executed")
    yield Promise.resolve(console.log(result));
    Promise.resolve(response.send(result))
  }catch(exception){
    console.log(exception)
  }
});

test();

但是当我运行此版本时出现以下错误:

Search job id:         1470853434.636329
/Users/nit/Documents/Progs/JavaScript/he_dashboard/services/splunkClass.js:109
      for(var i = 0; i < rows.length; i++) {
                             ^

TypeError: Cannot read property 'length' of undefined
    at /Users/nit/Documents/Progs/JavaScript/he_dashboard/services/splunkClass.js:109:30

我知道它正在输入_fetchJsonAsync方法并正确连接,因为它在错误之前记录了sid (job id)。这次看起来实际的工作对象有所不同,我似乎无法弄清楚原因。

提前致谢,

马兹

PS:我还在学习节点的过程中,同时尝试将它用于有用的东西。如果我一路上做其他愚蠢的事情,请告诉我。谢谢!

0 个答案:

没有答案