NodeJs POST-запрос ER_DATA_TOO_LONG - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь добавить запрос на сайт, но не понимаю, какую ошибку я получаю. Я отправляю четыре текстовых элемента, я уверен, что они правильные (размер, тип), и мне удается добавить элемент вручную в моей базе данных без проблем. Это не мой сайт, я не знаю, как это работает, поэтому я повторил еще один запрос. Однако ошибка говорит о том, что один из моих элементов слишком длинный, что не так, поэтому я немного растерялся.

Вот мой POST-запрос

app.post("/api/addOS" , function(req, res) {
    if(!(apikeys[req.query.username]===req.query.apikey) || (req.query.username == undefined) || (req.query.apikey == undefined)) {
        res.json({"error" : "not allowed"});
    } else {
        var con = new Database();
        var query = "INSERT INTO BRAND (name,abbr,color,type) VALUES ('"+req.body.name+"','"+req.body.abbr+"','"+req.body.couleur+"','"+req.body.type+"')";
        con.query(query).then(rows => {          
            res.json(rows);
        });
    }
});

Класс Database определен как следует

class Database {
constructor(  ) {
    this.connection = mysql.createConnection( {
      host: "localhost",
      user: "root",
      password: "pswd",
      database: "dbname"
  } );
}
query( sql, args ) {
    return new Promise( ( resolve, reject ) => {
        this.connection.query( sql, args, ( err, rows ) => {
            if ( err ){
                return reject( err );
            }
            resolve( rows );
        } );
    } );
}
close() {
    return new Promise( ( resolve, reject ) => {
        this.connection.end( err => {
            if ( err )
                return reject( err );
            resolve();
        } );
    } );
}

}

Ошибка, отображаемая на моей консоли веб-страницы, является следующей:

angular. js: 14525 Возможно необработанное отклонение: { "данные": NULL, "статус": - 1, "конфигурация": { "метод": "POST", "transformRequest": [NULL], "transformResponse": [NULL], "jsonpCallbackParam": "обратный вызов" , "url": "https://localhost: 4443 / api / addOS? username = test & apikey = z4oP > 3Jocv", "headers": {"Accept": "application / json, text / plain , /"}," name ":" testtest "," abbr ":" test "," type ":" os "," couleur ":" tre "}," statusText ":" " }

и на моей консоли это

(узел: 15728) UnhandledPromiseRejectionWarning: Ошибка: ER_DATA_TOO_LONG: слишком длинные данные для столбца 'abbr' в строке 1 в Query.Sequence._packetToError (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ protocol \ sequenc es \ Sequence. js: 47: 14) в Query.ErrorPacket (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ protocol \ sequence \ Query. js: 77: 18) в протоколе ._parsePacket (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ protocol \ Protocol. js: 291: 23) в Parser._parsePacket (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ protocol \ Parser. js: 433: 10) в Parser.write (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ protocol \ Parser. js: 43: 10) в Protocol.write (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ protocol \ Protocol. js: 38: 16) в Socket. (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ Connection. js: 91: 28) в сокете. (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ Connection. js: 525: 10) в Socket.emit (события. js: 223: 5) в addChunk (_stream_readable. * 1064) *: 309: 12) -------------------- at Protocol._enqueue (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ protocol \ Протокол. js: 144: 48) в Connection.query (C: \ wamp64 \ www\node \ node_modules \ mysql \ lib \ Connection. js: 201: 25) в C: \ wamp64 \ www\node \ app. js: 92: 29 в новом Promise () в Database.query (C: \ wamp64 \ www\node \ app. js: 91: 16) в C: \ wamp64 \ www\node \ app. js: 379: 9 в Layer.handle [как handle_request] (C: \ wamp64 \ www\node \ node_modules \ express \ lib \ router \ layer. js: 95 : 5) в следующем (C: \ wamp64 \ www\node \ node_modules \ express \ lib \ router \ route. js: 137: 13) в Route.dispatch (C: \ wamp64 \ www\node \ node_modules \ express \ lib \ router \ route. js: 112: 3) в Layer.handle [как handle_request] (C: \ wamp64 \ www\node \ node_modules \ express \ lib \ router \ layer. js: 95: 5) (узел: 15728) UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за того, что внутри asyn c -функции не было блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). (идентификатор отклонения: 1) (узел: 15728) [DEP0018] Предупреждение об устаревании: отклонения необработанного обещания устарели. В будущем отклонения обещания, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.

1 Ответ

1 голос
/ 16 марта 2020

Я вижу общие проблемы уровня:

1) никогда не создавать соединение с базой данных по времени запроса.

2) Ваш класс базы данных позволяет использовать обещания с подстановкой аргументов (? символов в мой пример), так что используйте его, это более безопасно.

Вы сказали, что поле abbr равно varchar(8), поэтому req.body.abbr.trim() в моем примере должно очищать пустые символы, которые, возможно, были проблемой.

Пожалуйста, попробуйте этот код и сообщите мне результаты.

const db = new Database(); // Connection must be created once

// authorization
const isAuthorized = function(req, res, next) {
  if(
   req.query.username && 
   req.query.apikey && 
   apikeys[req.query.username] === req.query.apikey
  ) {
    return next();
  }

  res.status(401).json({"error" : "not authorized"});
};

app.post(
  "/api/addOS", 
  isAuthorized,
  async function(req, res) {
    try {
      const result = await db.query(
        'INSERT INTO BRAND (name, abbr, color, type) VALUES (?, ?, ?, ?)',
        [req.body.name, req.body.abbr.trim(), req.body.color, req.body.type]
      );
      res.status(201).json(result);
    }
    catch (error) {
      res.status(500).json({message: error.message});
    }
  });
...