Bonjour,
j'utilise seqeulize-cli et mysql pour implementer 2 tables : Users et Posts. J'ai réalisé les modèles, les relations, les migrations et les seeders. Cependant j'ai un soucis au niveau des likers/dislikers qui sont des tableaux contenant les utilisateurs qui ont "liké"/"disliké" le post. J'ai lu que le type DataTypes.Array n'existe que pour postgres et que pour mysql il faut utiliser une solution de contournement (à écrire dans le fichier migration) comme ceci :
J'ai donc 2 questions qui sont liées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 favColors: { type: Sequelize.STRING, allowNull: false, get() { return this.getDataValue('favColors').split(';') }, set(val) { this.setDataValue('favColors',val.join(';')); },
1- qu'en est-il du fichier seeders ? Voici mes fichiers de migration et de seeder. Avez-vous une idée de la façon d'obtenir le tableau des likers et des dislikers dans le fichier seeder ?
2- le code ci-dessous donne un résultat, ma base de données est remplie mais avec likers/dislikers qui sont des nombres, pas un tableau. Et lorsque j'utilise postman pour créer un nouveau Post, cela me donne une erreur :fichier de migration pour Users :'(node:6148) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'split' of undefined'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 'use strict'; module.exports = { up: async(queryInterface, Sequelize) => { await queryInterface.createTable('Users', { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, firstName: { type: Sequelize.STRING }, familyName: { type: Sequelize.STRING }, email: { type: Sequelize.STRING }, password: { type: Sequelize.STRING }, role: { type: Sequelize.STRING }, photoUrl: { type: Sequelize.STRING }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }); }, down: async(queryInterface, Sequelize) => { await queryInterface.dropTable('Users'); } };
fichier de seeder pour Users :
fichier migration pour Posts :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 'use strict'; const faker = require('faker'); const bcrypt = require('bcrypt'); module.exports = { up: async(queryInterface, Sequelize) => { let users = []; let roles = ['ADMIN', 'MODER', 'BASIC']; for (let i = 0; i < 25; i++) { let r = Math.random().toString(36).substring(7); let pwdHashed = await bcrypt.hash(r, 10); //let userRole = roles[(Math.random() * roles.length) | 0]; let userRole = roles[Math.floor(Math.random() * roles.length)]; users.push({ firstName: faker.name.firstName(), familyName: faker.name.lastName(), email: faker.internet.email(), password: pwdHashed, role: userRole, photoUrl: faker.image.avatar(), createdAt: new Date(), updatedAt: new Date() }); }; await queryInterface.bulkInsert('Users', users, {}) }, down: async(queryInterface, Sequelize) => { await queryInterface.bulkDelete('Users', null, {}); } };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 'use strict'; module.exports = { up: async(queryInterface, Sequelize) => { await queryInterface.createTable('Posts', { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, posterId: { type: Sequelize.UUID, referes: { model: "Users", key: "id" } }, title: { type: Sequelize.STRING }, content: { type: Sequelize.TEXT }, imageUrl: { type: Sequelize.STRING }, videoUrl: { type: Sequelize.STRING }, likers: { type: Sequelize.STRING, get() { return this.getDataValue('likers').split(';') }, set(val) { this.setDataValue('likers', val.join(';')); }, required: true }, dislikers: { type: Sequelize.STRING, get() { return this.getDataValue('dislikers'); }, set(val) { this.setDataValue('dislikers', dislikers.push(val)); }, required: true }, likes: { type: Sequelize.INTEGER, default: 0 }, dislikes: { type: Sequelize.INTEGER, default: 0 }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }); }, down: async(queryInterface, Sequelize) => { await queryInterface.dropTable('Posts'); } };
fichier seeder pour Posts :
La requête post pour créer un nouveau Post avec Postman :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 'use strict'; const faker = require('faker'); module.exports = { up: async(queryInterface, Sequelize) => { let posts = []; let fakeLikersDislikers = []; for (let i = 0; i < 25; i++) { posts.push({ posterId: faker.datatype.uuid(), title: faker.lorem.sentence(), content: faker.lorem.sentence(), imageUrl: faker.image.city(), videoURL: faker.image.nature(), //videoURL: `${faker.image.nature()}?random=${Date.now()}`, likers: fakeLikersDislikers.push(faker.name.findName()), dislikers: fakeLikersDislikers.push(faker.name.findName()), likes: faker.datatype.number(), dislikes: faker.datatype.number(), createdAt: new Date(), updatedAt: new Date(), }); }; await queryInterface.bulkInsert('Posts', posts, {}) }, down: async(queryInterface, Sequelize) => { await queryInterface.bulkDelete('Posts', null, {}); } };
mais je reçois cette erreur dans la console :Merci d'avance(node:6148) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'split' of undefined'
Partager