使用mysql2模块时如何处理express中的错误

问题描述 投票:0回答:1
//auth router.js

const express = require("express");
const authService = require("../service/AuthService.js");

const router = express.Router();


router.post('/signup',async function(req, res,next){ 
    try{
    const body = req.body;
    const params = [body.email,body.password,body.nickname];
    const rst = await authService.signup(params);
    

    
    res.status(200);
    }catch(err){
        console.log(err);
        next(err);
        res.status(404).send("duplicated email address");
    }
    
})

module.exports = router;
// authService.js

const memberRepository = require("../repository/memberRepository");
const {v4: uuidv4} = require("uuid");
const nodemailer = require('nodemailer');
const dotenv = require('dotenv');
const redis = require('redis');

dotenv.config();

const redisClient = redis.createClient({legacyMode: true});
redisClient.on('connect', () => {
    console.info('RedisConnected!')
})

redisClient.connect().then();

redisClient.auth(1234);

const redisCli = redisClient.v4;

const transporter = nodemailer.createTransport({
    host:"smtp.gmail.com",
    port:587,
    auth:{
        user:'',
        pass: ''
    }
});

class AuthService{


     signup(params){
        try{
            return  memberRepository.signup(params);
        }catch(err){
            console.log("eqrwqrqrqrq");
        }   
    }

}
const authService = new AuthService();
module.exports = authService;
const db = require("../config/mysql.js");

class MemberRepository{

     signup(params){
        
        const sql = "insert into MEMBER (email,pw,nickname) values(?,?,?)";
        const conn =db.init();
        try{
            
            conn.query(sql, params ,function(err,result){
            
                if(err){
                    //console.log("query is not excuted: "+ err);
                    console.log('rrrrrrrrrrrrrrrrrrrrrr');
                    return;
                }
                else{
                    return result;
                }
            });

            const [result] =  conn.execute(sql,params);
            return result;
        }catch(err){
            console.log('fffff');
            return {code:500 , message:'eeeee'}
        }finally{
             conn.end();
        }

       
    }


}




const memberRepository = new MemberRepository;

module.exports = memberRepository;

我正在尝试在express中实现注册功能
但它不能很好地处理错误
当我使用现有电子邮件注册时
快递服务器显示错误消息,例如

RedisConnected!
fffff
{ code: 500, message: 'eeeee' }
rrrrrrrrrrrrrrrrrrrrrr
node:events:496
      throw er; // Unhandled 'error' event
      ^

Error: Duplicate entry '' for key 'MEMBER.email'
    at Packet.asError (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/packets/packet.js:738:17)
    at Execute.execute (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/commands/command.js:29:26)
    at Connection.handlePacket (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/connection.js:481:34)
    at PacketParser.onPacket (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/connection.js:97:12)
    at PacketParser.executeStart (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/packet_parser.js:75:16)
    at Socket.<anonymous> (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/connection.js:104:25)
    at Socket.emit (node:events:518:28)
    at addChunk (node:internal/streams/readable:559:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:510:3)
    at Readable.push (node:internal/streams/readable:390:5)
Emitted 'error' event on Connection instance at:
    at Connection._notifyError (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/connection.js:252:12)
    at Connection._handleFatalError (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/connection.js:183:10)
    at Connection.handlePacket (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/connection.js:491:12)
    at PacketParser.onPacket (/home/wo/DEV/CodeComm_front/CodeComm_front/code_comm_back/node_modules/mysql2/lib/connection.js:97:12)
    [... lines matching original stack trace ...]
    at Readable.push (node:internal/streams/readable:390:5) {
  code: 'ER_DUP_ENTRY',
  errno: 1062,
  sqlState: '23000',
  sqlMessage: "Duplicate entry '' for key 'MEMBER.email'",
  sql: 'insert into MEMBER (email,pw,nickname) values(?,?,?)',
  fatal: true
}

服务器关闭

我尝试添加类似的代码

 process.on('unhandleRejection', (err, result) => {
    err.message, err.code, err.stack
 })

 process.on('uncaughtException', (err, result) => {
    err.message, err.code, err.stack
})

在app.js中

但是axios收不到express服务器的响应。

例如,当我通过 axios 向服务器发送请求 5 次时,服务器仅保留响应,如果服务器关闭, 服务器向前端axios发送5次响应

node.js express mysql2
1个回答
0
投票

服务器关闭的原因是因为您的函数是在异步完成所有操作后调用的。

您不需要同时使用回调和 Promise 类型的查询执行方法,使用任意一种即可。

const db = require("../config/mysql.js");

class MemberRepository{

     signup(params){
        
        const sql = "insert into MEMBER (email,pw,nickname) values(?,?,?)";
        const conn = db.init();
        try{    
            return conn.execute(sql,params);
        }catch(err){
            console.log('fffff');
            return {code:500 , message:'eeeee'}
        }finally{
             conn.end();
        }

       
    }


}

const memberRepository = new MemberRepository();

module.exports = memberRepository;
© www.soinside.com 2019 - 2024. All rights reserved.