javascript 序列化类型错误:无法读取未定义的属性(读取"split")

0vvn1miw  于 2023-02-07  发布在  Java
关注(0)|答案(3)|浏览(158)

我正在尝试更新一个sequelize模型的一部分,它包含一个用分号分隔的字符串数组值。

languages: {
      type: Sequelize.STRING,
      allowNull: false,
      get() {
        if (this.getDataValue('languages') === null) {
          return [];
        } else {
          return this.getDataValue('languages').split(';');
        }
      },
      set(val) {
        if (val.length === 0) {
          this.setDataValue('languages', null);
        } else {
          this.setDataValue('languages', val.join(';'));
        }
      },
    },
ppcbkaq5

ppcbkaq51#

我找到了一个解决方案。在更新值之前,它读取当前值,当它在数据库中为空时,它给出未定义。通过增强if检查,它解决了这个问题。

languages: {
  type: Sequelize.STRING,
  allowNull: false,
  get() {
    if (this.getDataValue('languages') === null || this.getDataValue('languages') === undefined) {
      return [];
    } else {
      return this.getDataValue('languages').split(';');
    }
  },
  set(val) {
    if (val.length === 0) {
      this.setDataValue('languages', null);
    } else {
      this.setDataValue('languages', val.join(';'));
    }
  },
},
mrwjdhj3

mrwjdhj32#

简短回答

最好检查变量是null还是undefined,记住两个值是不同的。null表示没有任何内容,赋值为null,而undefined表示声明了一个变量,但没有赋值给它。
你可以这么做

if (!!this.getDataValue('languages')) {
      return this.getDataValue('languages').split(';');
    } else {
      return [];
    }

长长的回答

如果你想拦截所有的请求并替换值,例如:如果它是一个可以为空的列表,我想显示[],如果它是一个可以为空的布尔值,我想显示false
您可能希望使用中间件来实现这一点。
它将类似于下面的代码:

const app = express();

app.set("json replacer", (k, v) => {
  return formatJSONNull(k, v);
});

var formatJSONNull = function (k, v) {
  if (v === null || v === undefined) {
    if (listValues.indexOf(k) >= 0) {
      return [];
    } else if (integerValues.indexOf(k) >= 0) {
      return 0;
    } else if (boolValues.indexOf(k) >= 0) {
      return false;
    } else {
      return "";
    }
  }
  return v;
};

const listValues = ['languages'];

const boolValues = ['language_count'];

const integerValues = ['language_count'];

相关问题