0

我正在尝试做这样的事情:

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 语句有效,但 else 返回一个空数组

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,"error":"找不到系列: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);
        }
    }
});

当错误等于 'Error: Couldn\'t find series: ' + name.series 时,我传递值来创建它们。

谢谢。

4

1 回答 1

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函数来获取数字(我更新了callbackreturn (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'
    });
  });
};
于 2015-03-05T18:20:00.153 回答