Redis脚本无法在Node.js中正常运行

时间:2019-09-18 17:26:24

标签: node.js mongodb redis

我在应用程序中使用Redis。 Redis数据库每隔一段时间就会备份到Mongo。

我正在修复将Redis进行Mongo备份的cron作业。为了对其进行测试,我将代码作为脚本运行。我在让redis东西实际执行任何操作时遇到了麻烦。

基本上,脚本执行两件事。首先,它获取所有键,循环遍历它们,并创建从redis记录创建的mongo记录。之后,它将每个redis文件标记为已备份。其次,它再次循环浏览键,并删除标记为已备份的redis文件。

为了测试这一点,我在重新遍历所有键(应该只是最近创建的一个键)之前创建了一个新的哈希值。但是这些都没有发生。

代码如下:

exports.start = start = function (cb) {
  console.log('program begin')
  client.hmset(['newHASH', 'route', 'routeValue', 'ipAddress', 'ipAddressValue'], function (err, res) {
    if (err) {
      console.log(err)
    }
    console.log(res)
    client.keys('*', function (err, keys) { // gets all hashes in redis db, returns them as 'keys'
      if (err) {
        console.log(err)
      }
      console.log('keys: ' + keys)
      for (let i = 0, len = keys.length; i < len; i++) {  // loop through all keys
        client.hgetall(keys[i], function (err, results) {  // gets all key/value pairs from keys[i], returns them as 'results'
          if (err) {
            console.log(err)
          }
          /* --inserts the object to be stored in Mongo db using the key/value pairs from 'results'-- */
          AnalyticsRepo.create({
            route: results.route,
            ipAddress: Binary(results.ipAddress),  // converts string to binary
            userId: new ObjectID(results.userId),  // converts string to Mongo ObjectID
            timestamp: Date.parse(results.timestamp)},  // converts string to unix timestamp
            function (err, insert) {
              if (err) {
                console.log(err)
              }
            })
          // add backup field to keys[i] after saved to Mongo
          client.hset([keys[i], 'backup', 'true'], (err, backup) => {
            if (err) {
              console.log(err)
            }
          })
        })
      }
    })
    // 2nd iteration of all hashes in redis
    client.keys('*', function (err, keys) { // gets all hashes in redis db, returns them as 'keys'
      if (err) {
        console.log(err)
      }
      for (let i = 0, len = keys.length; i < len; i++) {
        // if the hash has been saved to Mongo (has a 'backup' field equal to 'true'), delete the hash from redis
        client.hget([keys[i], 'backup'], (err, backupField) => {
          if (err) {
            console.log(err)
          }
          if (backupField === 'true') {
            client.del(keys[i], (err, success) => {
              if (err) {
                console.log(err)
              }
              console.log('record deleted')
            })
          }
        })
      }
    })
  })
  cb()
}

const redisToMongo = function () {
  db.init(function (err, results) {
    if (err) {
      console.error(err)
      return process.exit(1)
    } else {
      start(() => {
        process.exit()
      })
    }
  })
}

let args = process.argv[1]

if (args === 'localPath') {
  redisToMongo()
  console.log('program run')
}

在最底部,我添加了代码,使我可以将代码作为脚本运行。我添加了一条日志语句:console.log('program run')此日志语句有效。同样,在实际函数的第一行中,我添加了一条日志语句:console.log('program begin')此日志语句也有效。但是,该函数中的其他日志语句均未执行任何操作。

运行程序时没有出现任何错误。为了确保redis做出某种反应,我在函数中给了它一个“错误的命令”,如下所示:client.hsetasdfg(...)这给了我一个错误,应该这样。就像一切正常,直到我执行第一个redis命令为止,然后程序没有执行应有的功能,但也没有给我错误。

理想情况下,如果脚本可以运行,我将运行它,然后检查mongoDB并查看是否已从脚本中添加了一个条目。

请告知。这里发生了什么?

0 个答案:

没有答案