所以我的功能很好。
这里是上下文的代码:
"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:我还在学习节点的过程中,同时尝试将它用于有用的东西。如果我一路上做其他愚蠢的事情,请告诉我。谢谢!