web-dev-qa-db-fra.com

Node.js Conception de modèle MySQL

Je développe une application node.js à l'aide de la base de données MySQL, mais je suis obligé de créer des modèles du côté node.js de mon application. J'ai déjà utilisé mongoose pour produire des schémas et utiliser des modèles pour effectuer des fonctions de base de données, mais je ne pouvais pas trouver un tel support pour MySQL. Quelqu'un peut-il suggérer un moyen approprié d'isoler mes fonctions de base de données dans node.js, comme je le ferais avec mangouste. voici mon modèle app.js et utilisateurs que j'utilise actuellement. 

fichier d'application: 

var express= require("express");
var bodyParser = require("body-parser");
var mysql = require("mysql");
var UserModel= require("./models/User.js")
var app=express();

var sql = mysql.createConnection({
    Host: "localhost",
    user: "root",
    password: "1234",
    database: "dricm"
});

sql.connect(function (err) {
    if(err){
        console.log("error");
    }else{
        console.log("connected");
    }
});

app.set("views", "./views");

app.use(express.static("node_modules/bootstrap/dist"));
app.use(express.static("public"));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));

app.get('/', function (req, res) {
    res.render("signup.jade");
});

app.post('/signup', function (req, res) {
    var obj= {
        username: req.body.username,
        password: req.body.password
    };
    UserModel.createUser(obj);
    res.redirect("/");
});

app.listen(3000, function () {
    console.log("server running at 3000");
});

Utilisateur (modèle probable)

var mysql= require("mysql");
var bcrypt = require("bcryptjs");

var sql = mysql.createConnection({
    Host: "localhost",
    user: "root",
    password: "1234",
    database: "dricm"
});

sql.connect(function (err) {
    if(err){
        console.log("error");
    }else{
        console.log("connected");
    }
});

var User= {

}

User.createUser = function createUser(newUser) {
    bcrypt.genSalt(10, function(err, salt){
        bcrypt.hash(newUser.password,salt, function (err, hash) {
            newUser.password = hash;
            var query = sql.query("INSERT INTO USERS set ?", newUser, function (err, res) {
                console.log(query);
                if(err) {
                    console.log("error");
                }
                else{

                    console.log(res.insertId);
                }
            });
        });
    });

}

module.exports= User;
7
Tanmoy

Ce que vous recherchez s'appelle un ORM (mappage relationnel-objet) Mongoose en est un pour MongoDB (qui est une base de données orientée document NOSQL)

Il existe d'autres ORM pour bases de données relationnelles qui fonctionnent avec Node.js. Le plus populaire actuellement est Sequelize que j'ai personnellement utilisé et recommandé.

Avec Sequelize, vous pouvez placer vos modèles dans différents fichiers, tout comme Mongoose. Toutefois, pour les charger, vous devez les ajouter avec un simple script dans votre index.js.

Imaginez l’espace de travail suivant:

--models/
----User.js
----Permissions.js
--index.js

Et vos définitions de modèle ressemblent à ceci:

User.js

const UserModel = (sequelize, Sequelize) => {
    const {INTEGER, STRING, FLOAT, BOOLEAN, DATE} = Sequelize
    const User = sequelize.define('User', {
        UserId: {type: INTEGER, primaryKey: true, autoIncrement: true},
        Username: {type: STRING, primaryKey: true, allowNull: false},
        Password: STRING
    })
    return User
}

module.exports = UserModel

Permissions.js

const PermissionsModel = (sequelize, Sequelize) => {
    const {INTEGER, STRING, FLOAT, BOOLEAN, DATE} = Sequelize
    const Permissions = sequelize.define('Permissions', {
        Role: {type: STRING, allowNull: false},
        ControllerAddress: {type: STRING, allowNull: false}
    })
    return Permissions
}

module.exports = PermissionsModel

Maintenant, vous devez utiliser le script suivant pour les utiliser dans votre index.js

let normalizedPath = require('path').join(__dirname, "models")
    require('fs').readdirSync(normalizedPath).forEach((file) => {
        sequelize.import('./models/' + file)
    })
    let {User, Permissions} = sequelize.models

Vous pouvez maintenant utiliser les instances User et Permissions pour les contrôler et appeler des fonctions telles que

User.create({Username, Password})
2
ATheCoder