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 :

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(';'));
},
J'ai donc 2 questions qui sont liées :
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 :
'(node:6148) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'split' of undefined'
fichier de migration pour Users :
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 :
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, {});
    }
};
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
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 :
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, {});
    }
};
La requête post pour créer un nouveau Post avec Postman :
Nom : Capture.png
Affichages : 169
Taille : 23,8 Ko

mais je reçois cette erreur dans la console :
(node:6148) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'split' of undefined'
Merci d'avance