数组变为未定义

时间:2017-01-04 01:53:18

标签: javascript node.js

我现在有一个最奇怪的错误;我构建了这个函数,用于从我的服务器的输出中删除xss漏洞,并且在解析MongoDB结果对象(使用模式中的子文档)时,数组属性会立即从数组更改为undefined。请参阅下面的代码和跟踪:

代码:

function xss(value){
  if(typeof value === "object" && value !== null){
    return xssObjectEscape(value);
  }else if(typeof value === "string"){
    return xssStringEscape(value);
  }
}

function xssStringEscape(text) {
   return text.replace(/&/g, '&').
     replace(/</g, '&lt;').  // it's not necessary to escape >
     replace(/"/g, '&quot;').
     replace(/'/g, '&#039;');
}

function xssObjectEscape(object) {
  for (var prop in object) {
    if(typeof object[prop] === "string"){
      object[prop] = xssStringEscape(object[prop]);
    }else if(Array.isArray(object[prop])){
      console.log("xss Array");
      console.log(`${prop}: ${JSON.stringify(object[prop])}`);
      console.log(object[prop]);
      console.log(typeof object[prop]);
      console.log(object[prop].constructor);
      console.log(object[prop].constructor.name);
      console.log(object[prop].length);
      for(let i = 0 ; i < object[prop].length ; i++){
        object[prop] = xss(object[prop][i]);
      }
    }else if(typeof object[prop] === "object" && object[prop] !== null){
      xssObjectEscape(object[prop]);
    }
  }
  return object;
}

跟踪:

xss Array
save: [null,null,null,null]
[ [Function: notify],
  [Function: notify],
  [Function: notify],
  [Function: notify] ]
object
[Function: Array]
Array
4
TypeError: Cannot read property 'length' of undefined
    at xssObjectEscape (/var/www/smq/services/secure/xss.js:30:39)
    at xssObjectEscape (/var/www/smq/services/secure/xss.js:34:7)
    at xssObjectEscape (/var/www/smq/services/secure/xss.js:34:7)
    at xssObjectEscape (/var/www/smq/services/secure/xss.js:34:7)
    at xss (/var/www/smq/services/secure/xss.js:5:12)
    at filter.user.then (/var/www/smq/handlers/session.js:29:21)
    at process._tickCallback (internal/process/next_tick.js:103:7)

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

  for(let i = 0 ; i < object[prop].length ; i++){
    object[prop] = xss(object[prop][i]);
  }

您在循环中用object[prop]覆盖undefined的值。您可能打算分配给object[prop][i],但是您使用object[prop]返回的undefined完全覆盖xss处的值。

下一个循环迭代测试停止条件i < object[prop].length,并引发异常。您的所有日志记录都没有帮助,因为您在错误的位置执行此操作。您应该检查} 之后的值,在循环中覆盖它。

请注意,您可能只是使用object[prop]而不是map循环:

for
相关问题