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、"エラー":"シリーズが見つかりませんでした: 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」の場合、値を渡して作成します。

ありがとう。

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関数を呼び出して番号を取得します(を更新し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'
    });
  });
};
于 2015-03-05T18:20:00.153 に答える