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

Check if some query is undefined and define a callback in that case

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

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 return 空数组

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,不幸的是这不起作用,这是 returns 的错误:

调试:处理程序,错误 {"msec":395.7593630000483,"error":"Couldn't find series: items.type.updated"} 调试:内部,错误 错误:找不到系列:items.type.updated

编辑 3:

我已经解决了尝试创建系列时的问题。当该系列不存在时,显示此错误'Error Couldn't find series [series name]',所以我将此代码放在错误代码中:

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 时,我传递值来创建它们。

谢谢。

异步代码不是那样工作的。当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更新为return (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'
    });
  });
};