我正在使用Node + Postgres应用,但我在使用Sequelize模型架构设置DataType.ARRAY时遇到了麻烦。
这是我的模型架构,
var ArtistRoles = sequelize.define('ArtistRoles', {
id:{
primaryKey: true,
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV1
},
name:{
type: DataTypes.STRING,
allowNull: false
},
tags: {
type: DataTypes.ARRAY(DataTypes.STRING),
defaultValue: []
}
},{
hooks:{
beforeCreate: function (role, options) {
//role.tags = JSON.stringify(role.tags);
console.log(role.tags);
}
},
classMethods: {
associate: function (models) {
// add relations model relations here
//ArtistRoles.belongsTo(models.Artists);
}
}
});
我使用Postman测试API,这是我如何将数据发布到服务器, 这是节点控制台上的错误跟踪。
TypeError: values.map is not a function
at ARRAY.BaseTypes.ARRAY.$stringify (~/PROJECTS/my-api/node_modules/sequelize/lib/dialects/postgres/data-types.js:385:33)
at ARRAY.ABSTRACT.stringify (~/PROJECTS/my-api/node_modules/sequelize/lib/data-types.js:77:17)
at Object.escape (~/PROJECTS/my-api/node_modules/sequelize/lib/dialects/abstract/query-generator.js:967:32)
at Object.insertQuery (~/PROJECTS/my-api/node_modules/sequelize/lib/dialects/abstract/query-generator.js:299:28)
at QueryInterface.insert (~/PROJECTS/my-api/node_modules/sequelize/lib/query-interface.js:497:33)
at .<anonymous> (~/PROJECTS/my-api/node_modules/sequelize/lib/instance.js:672:56)
at tryCatcher (~/PROJECTS/my-api/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (~/PROJECTS/my-api/node_modules/bluebird/js/release/promise.js:510:31)
at Promise._settlePromise (~/PROJECTS/my-api/node_modules/bluebird/js/release/promise.js:567:18)
at Promise._settlePromise0 (~/PROJECTS/my-api/node_modules/bluebird/js/release/promise.js:612:10)
at Promise._settlePromises (~/PROJECTS/my-api/node_modules/bluebird/js/release/promise.js:691:18)
at Async._drainQueue (~/PROJECTS/my-api/node_modules/bluebird/js/release/async.js:138:16)
at Async._drainQueues (~/PROJECTS/my-api/node_modules/bluebird/js/release/async.js:148:10)
at Immediate.Async.drainQueues (~/PROJECTS/my-api/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:637:20)
at tryOnImmediate (timers.js:610:5)
POST /api/1.0/role 500 46.114 ms - 45
可能是什么原因?请帮忙。
答案 0 :(得分:1)
对于 application / x-www-form-urlencoded ,发送到服务器的HTTP消息正文实际上是一个巨大的查询字符串。
因此,当在后端接收时,标签的值将采用字符串格式。 在后端将其转换回Array类型,你应该好好去
答案 1 :(得分:0)
我知道我的答案很晚,但即使我的测试通过,我也会使用Postman这个问题。我意识到我必须将每个数组值写为不同的键值,并且键的名称与链接图中的名称相同。
Postman将返回与数组同名的密钥,Sequelize Postgres Array数据类型将仅接收数组。我通过查看data-types.js文件意识到这一点。
但是,如果在Postman中只输入一个值,它将作为普通字符串返回,而Sequelize将拒绝它,这就是发生的事情。 Sequelize将值作为字符串发送, @mdsadiq 表示。您可以转换回后端的数组或输入多个键值。无论哪种方式,你应该添加一个从该值创建数组的beforeCreate钩子,或者Sequelize将像我在Image中所做的那样拒绝它。
我猜数组字符串也是如此,您可以在发送到数据库之前将其转换为钩子。我还没有通过表格在前端实现它,所以我不确定它将如何发挥作用。我希望这有助于某些人和更正将受到高度赞赏。
答案 2 :(得分:0)
var resArr = [];
var s =" [{'id':1,'name':'Test1'},{'id':2,'name':'Test2'}]";
var myObject = eval('(' + s + ')');
for (i in myObject)
{
resArr.push(myObject[i]["name"]);
}
使用resArr作为请求数组。希望它能解决错误。
答案 3 :(得分:0)
问题出在邮递员请求中,只需尝试用raw发送相同的请求
{
"name" : "Vocal",
"tags" : ["Carnatic", "Classical"]
}