【问题标题】:Contains is returning false包含返回 false
【发布时间】:2017-04-16 15:59:57
【问题描述】:

我从事了一个从 GIT 克隆的项目,与机器人相关。

事实上,在某些时候,这个机器人使用了 contains 函数,但这不起作用。使用谷歌我能够放置日志,并看到实际上列表包含字符串,但它总是返回 false。

这是函数:

var isFromUser = contains(cm.config.users, username, 'exists')

这是“日志”

username: 230592242
cm.config.bot.owner: 9587763
isFromOwner: false
cm.config.users: 230592242
isFromUser: false

如您所见,该用户在 registersd 用户中,但它返回 false。

这些是我在 NPE 中使用的库:

drwxr-xr-x 4 root root 110 Nov 29 16:58 chokidar
drwxr-xr-x 4 root root 135 Nov 29 16:58 easylogger
drwxr-xr-x 6 root root 164 Nov 29 16:58 easywizard
drwxr-xr-x 3 root root 105 Nov 29 16:58 jsonfile-config-manager
drwxr-xr-x 2 root root 107 Nov 29 16:58 multiple-contains
drwxr-xr-x 5 root root 121 Nov 29 16:58 winston

包含功能:

// Compare item with filter or another item
var checkItem = function(item, itemOrFilter) {

  // Defining array of filters
  var filters = []
  if (!Array.isArray(itemOrFilter)) {
    if (itemOrFilter.key != undefined)
      filters.push(itemOrFilter)
  } else {
    filters = itemOrFilter
  }

  // Filtering
  if (filters.length > 0) {
    var i = 0
    var match = true
    while (match && i < filters.length) {
      match = (item[filters[i].key] === filters[i].value)
      i++
    }
    return match
  }

  // Matching
  else {
    return (JSON.stringify(item) === JSON.stringify(itemOrFilter))
  }
}

// Search item in array.
var searchInArray = function(array, itemOrFilter, mode) {
  var found = { "index": -1, "filtered": []}
  var i = 0
  var end = false
  while ( i < array.length && !end) {
    end = (mode != 'filter' && mode != 'repetitions' && found.index != -1)
    if (checkItem(array[i], itemOrFilter)) {
      found.index = i
      found.filtered.push(array[i])
    }
    i++
  }
  return found
}

// Search substring or char in string.
var searchInString = function(string, item, mode) {
  var filtered = string.match(new RegExp(item, 'g'))
  var index    = (filtered) ? string.indexOf(filtered[0]) : -1
  var found    = { "index": index
                 , "filtered": filtered || []
                 }
  return found
}

// Search digit or subnumber in number.
var searchInNumber = function(number, item, mode) {
  var strnumber = number.toString()
  return searchInString(strnumber, item)
}


// Main function
module.exports = function contains (container, item, mode) {

  mode = (mode || 'index')
  var found = { "index": -1, "filtered": []}

  // Searching in number
  if (typeof container == "number")
    found = searchInNumber(container, item, mode)

  // Searching in string
  else if (typeof container == "string" || container instanceof String)
    found = searchInString(container, item, mode)

  // Searching in array
  else if (Array.isArray(container))
    found = searchInArray(container, item, mode)
  else console.log("Container type not allowed")

  // TODO: Search into object's properties
  //else if (container instanceof Object)  found = searchInObject(container, item)

  if (mode == 'exists') return found.filtered.length > 0
  if (mode == 'index')  return found.index
  if (mode == 'filter') return found.filtered
  if (mode == 'repetitions') return found.filtered.length
  console.log("Mode not allowed")
  return null
}

这些是我实现的日志:

// Filtering Messages
  var filterMessages = function(message) {
    // Formating message and preparing variables
    var username = (!message.from.username) ? message.from.id : message.from.username
    var messageToLog = logger.prepareMessage(message)
    // Checking message
    console.log('username: ' + username)
    console.log('cm.config.bot.owner: ' + cm.config.bot.owner)
    var isFromOwner = (username == cm.config.bot.owner)
    console.log('isFromOwner: ' + isFromOwner)
    console.log('cm.config.users: ' + cm.config.users)
    var isFromUser = contains(cm.config.users, username, 'exists')
    console.log('isFromUser: ' + isFromUser)
    var isCommand = (message.text && message.text.charAt(0) == '/' && message.text.length > 1)
    var activeUser = cmm.getActiveUserIdx(username)

这是日志中的输出:

username: 230592242
cm.config.bot.owner: 9587763
isFromOwner: false
cm.config.users: 230592242
isFromUser: false

控制台输出用户名被检索到的消息示例:

完整的日志输出,带有用户信息:

username: 230592242
cm.config.bot.owner: 9587763
isFromOwner: false
cm.config.users: 230592242
isFromUser: false
into the condition !isFromOwner && !isFromUser
[info] - [msg_1566] @230592242 : /ventas 2016-11-30
returning...
[info] - [msg_1567] @IBM_monitor_bot : Sorry, this is a private bot.
         [msg_1567] @IBM_monitor_bot : You need an authorization to use it

属性用户文件:

// Loading config
  cm.addFile(cfgPath + 'literals.json', null, true)
  cm.addFile(cfgPath + 'users.json', null, true)
  cm.addFile(cfgPath + 'bot.json', null, true, buildBot)
}

users.json 文件内容:

[
        "230592242"
]

消息示例:

[信息] - [msg_1566] @230592242 : /ventas 2016-11-30

消息准备:

// Filtering Messages
var filterMessages = function(message) {
// Formating message and preparing variables
var username = (!message.from.username) ? message.from.id : message.from.username
var messageToLog = logger.prepareMessage(message)

使用控制台和配置请求新日志:

{ files: 
   { easylogger: 
      { name: '/root/node_modules/private-telegram-bot/config/logger.json',
        watch: true },
     literals: 
      { name: '/root/node_modules/private-telegram-bot/config/literals.json',
        watch: true },
     users: 
      { name: '/root/node_modules/private-telegram-bot/config/users.json',
        watch: true },
     bot: 
      { name: '/root/node_modules/private-telegram-bot/config/bot.json',
        watch: true },
     help: 
      { name: '/root/node_modules/private-telegram-bot/config/help.json',
        watch: true },
     commands: 
      { name: '/root/node_modules/private-telegram-bot/config/commands.json',
        watch: true } },
  easylogger: { enabled: true, transports: [ [Object], [Object], [Object] ] },
  literals: 
   { en: 
      { notAuthorizedUserError: 'Sorry, this is a private bot.\nYou need an authorization to use it',
        notCommandError: '',
        unknownCommandError: 'I don\'t know this command.\nWhat do you want from me?',
        operationCancelledError: 'Operation has been cancelled',
        nothingToCancelError: 'Sorry, nothing to cancel',
        commandTimeoutError: 'command has been cancelled by timeout',
        commandOnlyForOwnerError: 'Sorry, this command is only for bot owner',
        noHelpError: 'Sorry, I can\'t help you.\nI haven\'t any info about this command',
        wellcomeMessage: 'Hi @%username%.\nWellcome to %botname%.',
        emptyUsernameError: 'Your friend does not have a name?',
        userAuthorizedError: 'Needless to add to your friend.\nHe was among the elect!',
        addUserSuccessMessage: 'Done! Currently, your friend can run all your public commands',
        addUserWellcomeMessage: 'Do you want to allow to a friend use your bot?\nI need his Telegram username for this',
        removeUserSuccessMessage: 'Done! User has been removed',
        removeUserWellcomeMessage: 'Do you want remove a user?',
        userNotFoundError: 'This user doesn\'t exist',
        wrongTokenError: 'Something is worng with this bot token. Check it in bot.json file',
        tokenNotFoundError: 'Token not found. Add your bot token in \'token\' property in bot.json file',
        ownerNotFoundError: 'Bot owner not found. Add your Telegram alias (without \'@\') in \'owner\' property in bot.json file',
        unknownLanguageError: 'Which language do you speak? I don\'t understand you\nI speak english(en) and spanish(es)\nCheck your default language in your bot config file (bot.json)' },
     es: 
      { notAuthorizedUserError: 'Lo siento, este es un bot privado.\nNecesitas autorizacion para usarlo',
        notCommandError: 'Solo se permite usar comandos.\nTodos los comandos empiezan por /',
        unknownCommandError: 'No conozco ese comando.\nQue quieres de mi?',
        operationCancelledError: 'La operacion ha sido cancelada',
        nothingToCancelError: 'Lo siento, no hay nada que cancelar',
        commandTimeoutError: 'comando ha sido cancelado por timeout',
        commandOnlyForOwnerError: 'Lo siento, ese comando es solo para el dueño del bot',
        noHelpError: 'Lo, siento, no puedo ayudarte.\nNo tengo ninguna informacion sobre ese comando',
        wellcomeMessage: 'Hola @%username%.\nBienvenido a %botname%.',
        emptyUsernameError: 'Tu amigo no tiene nombre?',
        userAuthorizedError: 'No hace falta añadir a tu amigo.\nYa estaba entre los elegidos!',
        addUserSuccessMessage: 'Hecho! Tu amigo ya puede ejecutar todos los comandos publicos',
        addUserWellcomeMessage: 'Quieres que un amigo pueda usar tu bot?\nPara eso necesito su usuario de Telegram',
        removeUserSuccessMessage: 'Hecho! Usuario eliminado',
        removeUserWellcomeMessage: 'Quieres eliminar un usuario?',
        userNotFoundError: 'Ese usuario no existe',
        wrongTokenError: 'Algo va mal con ese token. Compruebalo en el fichero bot.json',
        tokenNotFoundError: 'Token no encontrado. Añade tu token en la propiedad \'token\' de bot.json',
        ownerNotFoundError: 'Propietario del bot no encontrado. Añade tu alias de Telegram (sin \'@\') en la propiedad \'owner\' de bot.json',
        unknownLanguageError: 'Que lengua hablas? No te entiendo\nSolo hablo ingles(en) y español(es)\nComprueba tu lenguaje por defecto en el fichero de configuracion del bot (bot.json)' } },
  users: [ '9587763' ],
  bot: 
   { token: 'XXXXXXXXXXXXXXXXX',
     owner: 'XXX9587763XXX',
     updates: { enabled: true },
     responseNoAuthorizedMessages: true,
     defaultLanguage: 'en' },
  help: { commands: [ [Object], [Object], [Object], [Object], [Object] ] },
  commands: 
   { publicScriptsPath: '../publicScripts/',
     adminScriptsPath: '../adminScripts/',
     commandTimeout: 60000,
     adminCommands: [ 'adduser', 'removeuser' ],
     publicCommands: [ 'ventas' ] } }
[ '9587763' ]
username: 9587763
username length: 7
number
cm.config.bot.owner: XXX9587763XXX
false
isFromOwner: false
cm.config.users: 9587763
cm.config.users length: 7
object
isFromUser: false
into the condition !isFromOwner && !isFromUser
[info] - [msg_1620] @9587763 : /ventas

【问题讨论】:

  • "contain" 不是内置函数。请将该函数的主体添加到您的问题中。
  • 抱歉,我不是技术人员。您能否为愚蠢的人(像我一样)提供有关如何获取所需信息的详细信息?
  • 1 - 您是否使用任何 IDE 进行代码编辑(例如 webstorm 等)? 1.1: YES -&gt; 然后打开代码文件,你抓住“这是函数”部分。将鼠标光标移动到“包含”字词上,然后按“ctrl 或 cmd”并单击该字词。 1.1.1 -&gt; 你看到类似function contains 的东西吗? 1.1.1.1: YES -&gt; 复制该块并粘贴到此处。 1.1.1.2: NO -&gt; 然后右键单击并找到名为“转到定义”的菜单按钮。你找到了吗? 1.1.1.2.1: YES -&gt; 然后goto 1.1.1.11.1.1.2.2: NO -&gt; 抱歉什么都做不了。 1.2: NO -&gt;然后下载一个编辑器和goto 1.1
  • 朋友您好,我确实安装了webstorm,感谢您的帮助,这里是功能(编辑:由于大小,我添加到原帖)
  • 好的。你能告诉我console.log(cm.config.users, username);的输出吗

标签: javascript arrays node.js npm contains


【解决方案1】:

更新:正如 cmets 中所讨论的,您必须使用下面的 for 循环,因为 cm.config.users 是一个数组。

var isFromUser = false;
for(var i = 0; i < cm.config.users.length; i++) {
   isFromUser = contains(cm.config.users[i], username, 'exists');
   if(isFromUser) break;
}

该功能按预期工作,没有问题。当我使用与cm.config.users: 230592242 中提到的230592242 相同的值运行该函数时,它按预期返回true。当使用除此之外的值运行时,它返回false

我在下面给出了一个示例 sn-p 来确认这一点,您可以通过单击底部的 Run code snippet 来运行它。

你必须检查usernamecontains(cm.config.users, username, 'exists')使用的值是什么

由于使用的配置值是来自cm.config.users: 230592242 行的230592242,这看起来像是“用户ID”而不是您要检查的“用户名”。

这就是你收到false的原因。

// Compare item with filter or another item
var checkItem = function(item, itemOrFilter) {

  // Defining array of filters
  var filters = []
  if (!Array.isArray(itemOrFilter)) {
    if (itemOrFilter.key != undefined)
      filters.push(itemOrFilter)
  } else {
    filters = itemOrFilter
  }

  // Filtering
  if (filters.length > 0) {
    var i = 0
    var match = true
    while (match && i < filters.length) {
      match = (item[filters[i].key] === filters[i].value)
      i++
    }
    return match
  }

  // Matching
  else {
    return (JSON.stringify(item) === JSON.stringify(itemOrFilter))
  }
}

// Search item in array.
var searchInArray = function(array, itemOrFilter, mode) {
  var found = { "index": -1, "filtered": []}
  var i = 0
  var end = false
  while ( i < array.length && !end) {
    end = (mode != 'filter' && mode != 'repetitions' && found.index != -1)
    if (checkItem(array[i], itemOrFilter)) {
      found.index = i
      found.filtered.push(array[i])
    }
    i++
  }
  return found
}

// Search substring or char in string.
var searchInString = function(string, item, mode) {
  var filtered = string.match(new RegExp(item, 'g'))
  var index    = (filtered) ? string.indexOf(filtered[0]) : -1
  var found    = { "index": index
                 , "filtered": filtered || []
                 }
  return found
}

// Search digit or subnumber in number.
var searchInNumber = function(number, item, mode) {
  var strnumber = number.toString()
  return searchInString(strnumber, item)
}


// Main function
function contains (container, item, mode) {

  mode = (mode || 'index')
  var found = { "index": -1, "filtered": []}

  // Searching in number
  if (typeof container == "number")
    found = searchInNumber(container, item, mode)

  // Searching in string
  else if (typeof container == "string" || container instanceof String)
    found = searchInString(container, item, mode)

  // Searching in array
  else if (Array.isArray(container))
    found = searchInArray(container, item, mode)
  else console.log("Container type not allowed")

  // TODO: Search into object's properties
  //else if (container instanceof Object)  found = searchInObject(container, item)

  if (mode == 'exists') return found.filtered.length > 0
  if (mode == 'index')  return found.index
  if (mode == 'filter') return found.filtered
  if (mode == 'repetitions') return found.filtered.length
  console.log("Mode not allowed")
  return null
}

var cm = {
  config: {
    users: [
         230592242
      ]
  }
};

var userId = 230592242;
console.log('Checking the value user id "' + userId + '"..');
var isFromUser = false;
for(var i = 0; i < cm.config.users.length; i++) {
   isFromUser = contains(cm.config.users[i], userId, 'exists');
   if(isFromUser) break;
}
console.log(isFromUser);

var username = 'test'
console.log('Checking the value user name "' + username + '"..');
isFromUser = false;
for(var i = 0; i < cm.config.users.length; i++) {
   isFromUser = contains(cm.config.users[i], username, 'exists');
   if(isFromUser) break;
}
console.log(isFromUser);

【讨论】:

  • 评论不用于扩展讨论;这个对话是archived in chat。请不要在 cmets 中进行长时间的对话。
猜你喜欢
  • 2018-12-02
  • 2011-06-09
  • 1970-01-01
  • 2020-10-12
  • 2021-09-23
  • 1970-01-01
  • 2013-06-22
  • 2015-09-11
相关资源
最近更新 更多