Ошибка хочу ПОЛУЧИТЬ данные после POST — nodejs, mysql

#mysql #node.js #jwt

#mysql #node.js #jwt

Вопрос:

Я новичок в node.js и mysql. Сегодня я пытаюсь создать API, который подключается к БД, и теперь у меня проблема.

После регистрации (метод: POST) я не вижу всех данных (метод: GET). Пожалуйста, взгляните на ошибку:

на консоли:

 Server listening on port 3001
C:...node_modulesmysqllibprotocolParser.js:437
      throw err; // Rethrow non-MySQL errors
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at ServerResponse.header (C:...node_modulesexpresslibresponse.js:771:10)
    at ServerResponse.send (C:...node_modulesexpresslibresponse.js:170:12) 
    at ServerResponse.json (C:...node_modulesexpresslibresponse.js:267:15) 
    at ServerResponse.send (C:...node_modulesexpresslibresponse.js:158:21) 
    at response (C:...srccontrollersuser.js:93:9)
    at C:...srccontrollersuser.js:11:20
    at Query.<anonymous> (C:...srcmodelsuser.js:74:36)
    at Query.<anonymous> (C:...node_modulesmysqllibConnection.js:526:10)   
    at Query._callback (C:...node_modulesmysqllibConnection.js:488:16) {   
  code: 'ERR_HTTP_HEADERS_SENT'
}  

на Postman
введите описание изображения здесь

И если это может помочь вам помочь мне, это мой код:

Пользовательская модель

 const newUser = (a=null, b=null, c=null, d=null, e=null, f=null, g=null, cb=()=>{}) => {
    const qEmp = "INSERT INTO -- VALUE (?, ?, ?, ?, ?)"
    const qUsr = "INSERT INTO - VALUE (?, ?, ?, ?, ?)"
    const iEmp = [null, a, b, c, d]
    const iUsr = [null, e, f, g, 2]
    try {
        conn.query(qEmp, iEmp, 
        function (error, result, fields) {
            if (error){
                console.log("ERROR - newUser.fist: "   error);
                return cb("Internal Server Error", null)
            } else { 
                conn.query(qUsr, iUsr,
                        function (error, result, fields) {
                            if (error){
                                console.log("ERROR - newUser.second: "   error);
                                return cb("Internal Server Error", null)
                            }
                            return cb(null, result)
                        }
                    )
            }
            return cb(null, result)
        }) 
    } catch (err) {
        console.log("ERROR - catch: "   err);
        return cb("Internal Server Error", null)
    }
}  

на контроллере

 exports.register = (req, res) => {
    const { a, b, c, d, e, f, g } = req.body
    try {
        userModel.newUser(a, b, c, d, e, f, g, (error, userData) => {
            if (error) return res.status(500).send({error})
            return response(res, 200, "Success", userData)
        })
    } catch (error) {
        console.log("ERROR: addUser.catch = ");
        return res.status(500).send({error: "Internal Server Error"})
    }
}  

моя функция ответа

 const response = (res, code, message, data) => {
    res.send({
        code,
        message,
        data
    })
}  

Если вы видите что-то неправильное в моем коде, пожалуйста, сообщите мне сразу и (если вы можете (пожалуйста)) скажите мне, как это исправить. Спасибо! Хорошего дня!

Комментарии:

1. Я бы рекомендовал использовать async / await для лучшего управления кодом вместо обратных вызовов. Тем не менее, можете ли вы опубликовать суть того, что делает функция ответа? Эта ошибка обычно означает, что заголовки устанавливаются после отправки ответа с использованием res.write/res.send/res.json /etc. Я подозреваю, что что-то происходит в функции ответа.

2. Здравствуйте, извините за поздний ответ @SatyaKalluri . Я добавил свою функцию ответа. Кроме того, итак, можно ли изменить его на async / await? Потому что я думал, что единственный способ заставить этот код работать — использовать обратный вызов

3. ОБНОВЛЕНИЕ — @SatyaKalluri Оке, я пробовал использовать async / await вместо обратного вызова. но знаете ли вы, как остановить функцию? потому что мой не может прекратить отправку запроса на postman. я знаю, это потому, что я комментирую обратный вызов, но да, я знаю, как это остановить. Спасибо!

Ответ №1:

Итак, у меня есть свой ответ. Мне просто нужно удалить два обратных вызова

 const newUser = (a=null, b=null, c=null, d=null, e=null, f=null, g=null, cb=()=>{}) => {
    const qEmp = "INSERT INTO -- VALUE (?, ?, ?, ?, ?)"
    const qUsr = "INSERT INTO - VALUE (?, ?, ?, ?, ?)"
    const iEmp = [null, a, b, c, d]
    const iUsr = [null, e, f, g, 2]
    try {
        conn.query(qEmp, iEmp, 
        function (error, result, fields) {
            if (error){
                console.log("ERROR - newUser.fist: "   error);
                return cb("Internal Server Error", null)
            } else { 
                conn.query(qUsr, iUsr,
                        function (error, result, fields) {
                            if (error){
                                console.log("ERROR - newUser.second: "   error);
                            }
                        }
                    )
            }
            return cb(null, result)
        }) 
    } catch (err) {
        console.log("ERROR - catch: "   err);
        return cb("Internal Server Error", null)
    }
}  

И мой regis fom работает хорошо 🙂