2016-11-27 133 views
1

我正在使用Node + Postgres应用程序,并且我在使用Sequelize模型模式设置DataType.ARRAY时遇到问题。Sequelize-Postgres错误:values.map不是函数

这里是我的模型模式,

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); 
     } 
    } 
    }); 

我用邮差测试API,这里是我如何POST数据到服务器, enter image description here 这里是节点控制台上的错误跟踪。

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

你能分享你的'data-types.js'吗?或至少有一些线385线? –

回答

0

对于application/x-www-form-urlencoded,发送到服务器的HTTP消息的主体本质上是一个巨大的查询字符串。

因此,标签的值在后端接收时将采用字符串格式。 在后端将其转换回阵列类型,您应该很好去

0

我知道我的答案已经晚了,但即使在我的测试通过时,我也有同样的问题使用邮差。我意识到我必须将每个数组值写入一个不同的键值,其键名与链接图中所示的名称相同。

Postman Key-Value

邮差将返回键具有相同名称为阵列和Sequelize Postgres的阵列的数据类型将只接收阵列。我从回顾data-types.js文件中意识到了这一点。

但是,如果Postman中只输入一个值,它将作为普通字符串返回,而Sequelize会拒绝它,这就是发生的情况。 Sequelize将该值作为字符串发送,如@ mdsadiq表示。您可以将其转换回后端的数组或输入多个键值。无论采用哪种方式,您都应该添加一个从该值创建数组的beforeCreate挂钩,否则Sequelize将会按照我在图像中所做的那样拒绝它。

Before Create Hook

我想这同样适用于数组字符串,可以将其在钩发送到数据库之前转换。我还没有通过一个表单在前端实现它,所以我不知道这将如何发挥。我希望这可以帮助别人,更正将得到高度赞赏。