检查某些查询是否未定义,并在此情况下定义回调

时间:2015-03-05 15:33:24

标签: node.js influxdb

我试图做这样的事情:

var query = 'select max(count) from ' + series +
    ' where value = \'' + search + '\'';

if (db.query(query, callback) !== undefined) {

    return callback;
} else {

    return callback = [{
        name: series,
        columns: ['time', 'max'],
        points: [
            [0, 0]
        ]
    }];
}

我试图验证该查询是否未定义,或者搜索的元素是否存在于Influxdb中,然后设置回调就像元素存在一样,if语句有效,但是其他返回一个空数组

db参数是数据库配置的位置。

修改

感谢Osukaa的回答。我尝试你所采取的措施,但没有回应。以下是您的更改的完整功能:

var counter = function (config, callback) {

var count = 'select max(count) from ' + series + ' where value = \'' + search + '\'';

db.query(count, function (err, res) {
  if(err) return err;

  if(res.length == 0){
    return [{
      name: series,
      columns: ['time', 'max'],
      points: [
        [0, 0]
      ]
    }];
  }else{
    return res;
  }

});   
};

console.log显示一个空数组。

编辑2:

感谢@Osukaa,遗憾的是,无法正常工作,这是错误返回:

调试:处理程序,错误     {" msec":395.7593630000483,"错误":"无法找到系列:items.type.updated"} 调试:内部,错误     错误:无法找到系列:items.type.updated

编辑3:

我尝试创建一个系列时解决了这个问题。如果系列不存在,请显示此错误'错误无法找到系列[系列名称]',因此我将此代码放入错误代码中:

db.query(qCount, function(err, res) {

    if (err) {

        if (err == 'Error: Couldn\'t find series: ' + name.series) {

            res = newSeries;
            return callback(null, res);
        } else {

            return callback(err);
        }
    } else {

        if (res.length !== 0) {

            return callback(null, res);
        } else {

            res = newSeries;
            return callback(null, res);
        }
    }
});

当错误等于“错误:无法找到系列:' + name.series,我传递值来创建它们。

感谢。

1 个答案:

答案 0 :(得分:0)

异步代码不能像那样工作。 db.query完成后,它将自动执行callback代码。您没有必要执行return callback。相反,你可以尝试这样的事情:

db.query('select max(count) from ' + series +
' where value = \'' + search + '\'' + ';', function (err, res) {
  if(err) return err;

  if(res.length == 0){
    return [{
      name: series,
      columns: ['time', 'max'],
      points: [
        [0, 0]
      ]
    }];
  }else{
    return res;
  }

});

修改

首先,让GET获取计数

request.get('/itemCount')
.query({value: value.type})
.end(function(err, res) {
  if (err) {
    reply(err);
  } else {
    countElemnts(res.body[0].count);
  }
});

所以服务器进入路由并执行处理程序:

server.route({
  method: 'GET',
  path: '/itemCount',
  handler: function(request, reply) {
    events.selectCount({
      series: 'value.type',
      search: request.url.query.value
    }, function onSuccess(err, data) {      
      if (err) {
        reply(err);
      } else {
        var result = {};
        if (data.length !== 0) {
          result = data[0].points.map(function(element) {
            return {
              count: element[1] + 1
            };
          });
          reply(null, result);
        } else {
          reply(null, data);
        }
      }
    });
  }
});

它自己调用selectCount函数来获取数字(我更新了callback以返回(null,res)

var selectCount = function(config, callback) {

  var qCount = 'select max(count) from ' + config.series +
  ' where itemType = \'' + config.search + '\'';

  db.query(qCount, function(err, res) {  
    if (err) {
      return callback(err);
    }else{
      if (res !== undefined) {
        return callback(null,res[0]);
      }else{
        var res = [{
          name: config.series,
          columns: ['time', 'count'],
          points: [
            [0, 0]
          ]
        }];
        return callback(null,res);
      }
    }
  });
};

当回调结束时,它应该执行countElements

var countElemnts = function(count) {
  superagent
  .post(config.eventsApiUrl)
  .type('json')
  .send({
    name: 'items.type.updated',
    data: {
      id: request.params.id,
      itemType: item.itemType,
      count: count
    }
  })
  .end(function() {
    reply({
      message: 'Item actualizado'
    });
  });
};