我正在尝试部分更新包含以分号分隔的字符串数组值的序列化模型。
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(';'));
}
},
},
我找到了一个解决方案。在更新值之前,它读取当前值,当它在数据库中为null时,它给出未定义。通过增强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(';'));
}
},
},
简短回答
最好检查变量是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'];