Can';t使用NodeJS使用异步/等待到MySQL事务
我是如何将mysql与nodejs结合使用的初学者 所以我在youtube上尝试了这个基本教程,并开始调整它 我正在尝试使用async/await,以便在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
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();等待连接。回滚();但它还是救了我