Comment puis-je faire ma connexion Node.js MySQL comme une œuvre de promesse?

Christopher Smith:

Je viens de commencer à travailler avec Node.js et ma connaissance js est un peu rouillé.

J'ai commencé avec callbacks et j'ai découvert des promesses. Cette syntaxe est plus comme mes œuvres du cerveau, donc je réécris mon code avec des promesses. Mais maintenant ma connexion MySql ne fonctionne pas. Il ne peut même pas atteint (je crois ...) Je suis connecté le mot « test » dans le fichier BDD, qui a travaillé. Mais dans le fichier MYSQL le console.log « test2 » n'a pas marché.

Merci à vous tous! Chris

Voici mon server.js (le fichier qui démarre nœud):

/* REQUIRE */
const oAuth2Server = require('node-oauth2-server');
const express = require('express');
const bodyParser = require('body-parser');
const oAuthModel = require('./endpoints/auth/authModel');
const util = require('util');
const dbCon = require('./subsystem/mySql')

/* CONST */
const port = 3000;
const debug = true;
const app = express();

/* INIT */
app.oauth = oAuth2Server({
    model: oAuthModel,
    grants: ['password'],
    debug: debug
})

/* ROUTER */
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(app.oauth.errorHandler());


const authRoutes = require('./router/auth')(express.Router(), app, dbCon)
app.use('/auth', authRoutes);

app.all('*', (req, res) => {
    res.status(404).send({message: "This service was not found"});
});




/* Start Server */
app.listen(port, () => {
    console.log(`listening on port ${port}`)
})

Voici mon fichier routeur auth.js:

module.exports =  (router, expressApp, dbCon) => {
    const userDB = require('../endpoints/user/userDB')(dbCon)
    const authMiddleware = require('../endpoints/auth/authMiddleware')
    const userMiddleware = require('../endpoints/user/userMiddleware')(userDB)

    router.post('/registerUser', userMiddleware.registerUser)

    //router.post('/login', expressApp.oauth.grant(), authMiddleware.login)
    router.post('/login', expressApp.oauth.grant())
    return router
}

Voici mon fichier BDD:

let mySqlConnection;

module.exports = injectedMySqlConnection => {

    mySqlConnection = injectedMySqlConnection

    return {

        registerUserInDB: registerUserInDB,
        getUserFromCrentials: getUserFromCrentials,
        doesUserExist: doesUserExist,
        getUserByUsername: getUserByUsername
    }
}

const registerUserInDB = (username, password) => {
    return new Promise((resolve,reject) => {
        //execute the query to register the user
        mySqlConnection.query(`INSERT INTO users (username, user_password) VALUES ('${username}', SHA('${password}'))`)
        .then(data => {resolve(true)})
        .catch(error => {reject(error)})
    })
}

const getUserFromCrentials = (username, password) => {
    return new Promise((resolve,reject) => {
        //create query using the data in the req.body to register the user in the db
        const getUserQuery = `SELECT * FROM users WHERE username = '${username}' AND user_password = SHA('${password}')`

        console.log('getUserFromCrentials query is: ', getUserQuery);

        //execute the query to get the user
        mySqlConnection.query(getUserQuery)
        .then(data => {resolve(data)})
        .catch(error => {reject(error)})
    })
}

const doesUserExist = username => {
    return new Promise((resolve,reject) => {
        console.log('test');
        //execute the query to check if the user exists
        mySqlConnection.query(`SELECT * FROM users WHERE username = '${username}'`)
        .then(data => {resolve(data.results !== null ? data.results.length == 1 ? true : false : false)})
        .catch(error => {reject(error)})
    })
}

const getUserByUsername = username => {
    return new Promise((resolve,reject) => {
        //execute the query to check if the user exists
        mySqlConnection.query(`SELECT id, username FROM users WHERE username = '${username}'`)
        .then(data => {resolve(data)})
        .catch(error => {reject(error)})
    })
}

Voici mon userMiddleware (est-ce middleware?):

let userDb;

module.exports = injectedUserDb => {
    userDb = injectedUserDb
    return {
        registerUser: registerUser
    }
}

function registerUser(req, res){

    console.log(`authRoutesMethods: registerUser: req.body is:`, req.body);

    //query db to see if the user exists already
    userDb.doesUserExist(req.body.username)
    .then(data => {
        if(data)
        {
            sendResponse(res, "User already exists", 200)
            return
        }
        else
        {   
            //register the user in the db
            userDb.registerUserInDB(req.body.username, req.body.password)
            .then(data => {
                userDb.getUserByUsername(req.body.username)
                .then(data => {sendResponse(res,  data.results, "")})
                .catch(error => {sendResponse(res, "Failed to register user", error)})

            })
            .catch(error => {sendResponse(res, "Failed to register user", error)})
        }
    })
    .catch(err => {
        sendResponse(res, "User already exists", 200)
        return
    })
}


function sendResponse(res, message, error) {

    res
        .status(error !== null ? error !== null ? 400 : 200 : 400)
        .json({
            'message': message,
            'error': error,
        })
}

Et last but not least mon fichier mySql.js:

var mySql = require('mysql');

const query = sql => {
    return new Promise( ( resolve, reject ) => {
        let connection = mysql.createConnection({
            host: 'localhost',
            user: 'root',
            password: '',
            database: 'oauth2test'
        });
        console.log('test2');
        connection.query( sql, ( err, rows ) => {
            if ( err )
            {
                connection.end();
                reject( err );
            }
            else
            {
                connection.end();
                resolve( rows );
            }
        });
    });
}

module.exports.query = query;
Terry Lennox:

Vous avez une simple faute de frappe dans votre fichier mySql.js:

La ligne

var mySql = require('mysql');

devrait être remplacé par

var mysql = require('mysql');

Autre que le code de requête fonctionne bien sur ma machine:

var mysql = require('mysql');

const query = sql => {
    return new Promise( ( resolve, reject ) => {
        let connection = mysql.createConnection({
            host: 'localhost',
            user: 'root',
            password: '',
            database: 'oauth2test'
        });
        console.log('test2');
        connection.query( sql, ( err, rows ) => {
            if ( err )
            {
                connection.end();
                reject( err );
            }
            else
            {
                connection.end();
                resolve( rows );
            }
        });
    });
}

module.exports.query = query;

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=373216&siteId=1
conseillé
Classement