Can';t使用NodeJS使用异步/等待到MySQL事务

Can';t使用NodeJS使用异步/等待到MySQL事务,mysql,node.js,async-await,Mysql,Node.js,Async Await,我是如何将mysql与nodejs结合使用的初学者 所以我在youtube上尝试了这个基本教程,并开始调整它 我正在尝试使用async/await,以便在mysql中开始一个事务 这是密码 const pool = require('../../config/database') module.exports = { create: async (data, callBack) => { const connection = await pool.getConn

我是如何将mysql与nodejs结合使用的初学者

所以我在youtube上尝试了这个基本教程,并开始调整它

我正在尝试使用async/await,以便在mysql中开始一个事务

这是密码

const pool = require('../../config/database')

module.exports = {
    create: async (data, callBack) => {

        const connection = await pool.getConnection();

        await connection.beginTransaction();

        try {

            await connection.query(
                `insert into user_details(fullname,gender,email,password,phone_number)
                values(?,?,?,?,?)`,
                [
                    data.fullName,
                    data.gender,
                    data.email,
                    data.password,
                    data.phone_number
                ],
                (error, results, fields) =>{
                    if(error){
                        return callBack(error);
                    }
                        return callBack(null, results);
                }
            );
            await connection.commit();

        } finally {

            connection.release();

        }
    }
}
但是事情是,连接是未定义的

我在行
const connection=wait pool.getConnection()之前控制台了pool并且它不为空。
但是在
const connection=wait pool.getConnection()之后连接未定义

有什么帮助吗D

编辑: 致@Terry Lennox

这是日志

addUserDetails, creating connection...
addUserDetails, creating connection...
addUserDetails, starting transaction...
addUserDetails, running query...
addUserDetails, an error occurred: TypeError: Cannot read property 'fullName' of undefined
    at Object.addUserDetails [as create] (C:\Playground\nodejs-mysql\api\users\user.service.js:19:26)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:12412) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'fullName' of undefined
    at Object.addUserDetails [as create] (C:\Playground\nodejs-mysql\api\users\user.service.js:19:26)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:12412) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:12412) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
addUserDetails, starting transaction...
addUserDetails, running query...
addUserDetails, committing transaction...
addUserDetails, transaction committed.
编辑:

这是我的app.js

require('dotenv').config();
const express = require('express');
const app = express();
const userRouter = require('./api/users/user.router');

app.use(express.json());

app.use('/api/users', userRouter);

app.listen(process.env.PORT, ()=>{
    console.log("Server is now running");
})
这是我的user.router.js

const userController = require('./user.controller')
const router = require('express').Router();
const {checkToken} = require('../../auth/token.validation');


router.post("/", userController.createUser);
router.get("/", checkToken, userController.getUsers);
router.get("/:id", checkToken, userController.getUserById);
router.patch("/", checkToken, userController.updateUser);
router.delete("/:id", checkToken, userController.deleteUser);
router.post("/login", userController.login)


module.exports = router;
这是我的控制器

const userService = require('./user.service');

const { genSaltSync, hashSync, compareSync} = require('bcryptjs');
const { sign } = require('jsonwebtoken');


module.exports = {
    createUser: (req,res) =>{
        const body = req.body;
        const salt = genSaltSync(10);
        body.password = hashSync(body.password, salt);
        userService.create()
        userService.create(body, (err, results)=>{
            if(err){
                console.log(err);
                return res.status(500).json({
                    success: 0,
                    message: "An error occured: "+ err
                })
            }
            return res.status(200).json({
                success: 1,
                code: results,
                data: body

            });
        })
    }
}
最后是我的service.js

async function addUserDetails(data) {
        console.log("addUserDetails, creating connection...");
        const connection = await pool.getConnection();

        try {
            console.log("addUserDetails, starting transaction...");
            await connection.beginTransaction();

            console.log("addUserDetails, running query...");
            const queryResult = await connection.query(
                `insert into user_details(fullname,gender,email,password,phone_number) values(?,?,?,?,?)`,
                [
                    data.fullName,
                    data.gender,
                    data.email,
                    data.password,
                    data.phone_number
                ]
            );

            console.log("addUserDetails, committing transaction...");
            await connection.commit();
            console.log("addUserDetails, transaction committed.");
            return queryResult;
        } catch (error) {
            console.error("addUserDetails, an error occurred:", error);

        } finally {
            connection.release();
        }
    }

module.exports = {
create: addUserDetails
}
这里还有我的池配置

PORT = 3000
DB_PORT = 3306
DB_HOST = localhost
DB_USER = root
DB_PASS =

我建议用mysql2试试,你会得到一个基于承诺的界面,很好用。。您还可以使用承诺而不是回调返回结果

用户。服务:

const mysql = require('mysql2/promise');

const config = {
    host: 'some_host',
    user: 'some_user',
    password: 'some_password',
    database: 'some_db'
}

const pool = mysql.createPool(config);

async function addUserDetails(data) {

    console.log("addUserDetails, creating connection...");
    const connection = await pool.getConnection();

    try {
        console.log("addUserDetails, starting transaction...");
        await connection.beginTransaction();

        console.log("addUserDetails, running query...");
        const queryResult = await connection.query(
            `insert into user_details(fullname,gender,email,password,phone_number) values(?,?,?,?,?)`,
            [
                data.fullName,
                data.gender,
                data.email,
                data.password,
                data.phone_number
            ]
        );

        console.log("addUserDetails, committing transaction...");
        await connection.commit();
        console.log("addUserDetails, transaction committed.");
        return queryResult;
    } catch (error) {
        console.error("addUserDetails, an error occurred:", error);
        throw error;
    } finally {
        connection.release();
    }
}

module.exports = {
    create: addUserDetails
}


// Test the function.. this can all be deleted later on!
const data = { 
    fullName: "Jim Ryan",
    gender: "Male",
    email: "jim.ryan@example.com",
    password: "123",
    phone_number: "555-442"
}

async function testAddUserDetails() {
    try { 
        let results = await addUserDetails(data);
        console.error(`testAddUserDetails: results:`, results);
    } catch (error) {
        console.error(`testAddUserDetails: Error:`, error);
    }
}

testAddUserDetails();
const userService = require('./user.service');

const { genSaltSync, hashSync, compareSync} = require('bcryptjs');
//const { sign } = require('jsonwebtoken');

module.exports = {  
    createUser: async (req, res) => {
        const body = req.body;
        const salt = genSaltSync(10);
        body.password = hashSync(body.password, salt);
        try { 
            let results = await userService.create(body);
            return res.status(200).json({
                success: 1,
                code: results,
                data: body
            });
        } catch (err) {
            console.log(err);
            return res.status(500).json({
                success: 0,
                message: "An error occured: "+ err
            })
        }
    }
}
更新的用户控制器:

用户控制器:

const mysql = require('mysql2/promise');

const config = {
    host: 'some_host',
    user: 'some_user',
    password: 'some_password',
    database: 'some_db'
}

const pool = mysql.createPool(config);

async function addUserDetails(data) {

    console.log("addUserDetails, creating connection...");
    const connection = await pool.getConnection();

    try {
        console.log("addUserDetails, starting transaction...");
        await connection.beginTransaction();

        console.log("addUserDetails, running query...");
        const queryResult = await connection.query(
            `insert into user_details(fullname,gender,email,password,phone_number) values(?,?,?,?,?)`,
            [
                data.fullName,
                data.gender,
                data.email,
                data.password,
                data.phone_number
            ]
        );

        console.log("addUserDetails, committing transaction...");
        await connection.commit();
        console.log("addUserDetails, transaction committed.");
        return queryResult;
    } catch (error) {
        console.error("addUserDetails, an error occurred:", error);
        throw error;
    } finally {
        connection.release();
    }
}

module.exports = {
    create: addUserDetails
}


// Test the function.. this can all be deleted later on!
const data = { 
    fullName: "Jim Ryan",
    gender: "Male",
    email: "jim.ryan@example.com",
    password: "123",
    phone_number: "555-442"
}

async function testAddUserDetails() {
    try { 
        let results = await addUserDetails(data);
        console.error(`testAddUserDetails: results:`, results);
    } catch (error) {
        console.error(`testAddUserDetails: Error:`, error);
    }
}

testAddUserDetails();
const userService = require('./user.service');

const { genSaltSync, hashSync, compareSync} = require('bcryptjs');
//const { sign } = require('jsonwebtoken');

module.exports = {  
    createUser: async (req, res) => {
        const body = req.body;
        const salt = genSaltSync(10);
        body.password = hashSync(body.password, salt);
        try { 
            let results = await userService.create(body);
            return res.status(200).json({
                success: 1,
                code: results,
                data: body
            });
        } catch (err) {
            console.log(err);
            return res.status(500).json({
                success: 0,
                message: "An error occured: "+ err
            })
        }
    }
}

您也可以将其用于mysql,只需使用此函数,而不需要任何参数或回调。请确保您具有异步函数,并改用这些函数:

await con.rollback();
await con.beginTransaction();
await con.commit();

请提供
pool.getConnection()
definition也
await
仅在您等待承诺时才执行任何有用的操作。您的
connection.query()
没有返回承诺,因此
wait
不会执行任何操作。使用mysql2中的promise接口,以获得与promises一起工作的mysql数据库接口。@jfriend00我现在切换到mysql2,但代码仍然不起作用
await pool.getConnection()中发生的事情?。将该代码添加到mysql2中的promise接口中,您读过吗?您必须使用该特定接口。只要在NPM页面上搜索“承诺”,文档就在那里。我希望你能按照那里的指示去做。发生了一个错误。我还从邮递员那里发送了数据。。。没有响应,但数据已保存。。。我在哪里添加退货以便发送回成功插入的消息?好的,很酷,我将添加一个快递路线示例,以演示如何执行此操作!那太好了,我会等着的:)我不知道如何把它放在我的代码中。。编辑了我上面的帖子,请检查我还有一件事,为什么rollback()不起作用?我替换了wait连接。commit();等待连接。回滚();但它还是救了我