【问题标题】:Check if some query is undefined and define a callback in that case检查某些查询是否未定义并在这种情况下定义回调
【发布时间】:2015-03-05 15:33:23
【问题描述】:

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

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

调试:处理程序,错误 {“毫秒”: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);
        }
    }
});

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

谢谢。

【问题讨论】:

    标签: node.js influxdb


    【解决方案1】:

    异步代码不能这样工作。当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'
        });
      });
    };
    

    【讨论】:

    • 现在如果系列不存在给我错误但不要创建系列。会发生什么?这是错误:{"msec":30.899682998657227,"error":"Couldn't find series: series.updated"}
    • 你的console.log在哪里没有显示任何东西?类似于console.log(counter)
    • 我解决了这个问题,现在如果系列不存在会给我错误但不要创建系列。这是我使用的完整代码所在的 google 群组链接:groups.google.com/forum/?hl=es-419#!topic/influxdb/XnpA0t84ywQ
    • @diego 可能是您没有使用callback(null,res) 返回selectCount 回调。我用你的完整代码更新了我的答案。
    • 感谢您的回复,不幸的是,在第一个帖子中是给我的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2022-06-13
    • 2019-10-19
    相关资源
    最近更新 更多