NodeJ的POST请求ER_DATA_TOO_LONG

时间:2020-03-16 03:31:47

标签: node.js post request

我正在尝试向网站添加发帖请求,但我不明白我遇到的错误。我正在发送四个文本元素,我确定它们是正确的(大小,类型),而且我设法在数据库中手动添加了一个元素而没有问题。这不是我的网站,我真的不知道它是如何工作的,所以我重复了另一个请求。但是错误是说我的要素之一太长了,事实并非如此,所以我有点困惑。

这是我的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);
        });
    }
});

数据库类的定义如下

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可能未处理的拒绝:{“ data”:null,“ status”:-1,“ config”:{“ method”:“ POST”,“ transformRequest”:[null],“ transformResponse” :[null],“ jsonpCallbackParam”:“回调”,“ url”:“ https://localhost:4443/api/addOS?username=test&apikey=z4oP> 3Jocv”,“ headers”:{“ Accept”:“ application / json,text / plain, / < / em>“},” name“:” testtest“,” abbr“:” test“,” type“:” os“,” couleur“:” tre“},” statusText“:”“}

控制台上的那个就是这个

(节点:15728)UnhandledPromiseRejection警告:错误:ER_DATA_TOO_LONG:第1行的列'abbr'的数据太长 在Query.Sequence._packetToError(C:\ wamp64 \ www \ node \ node_modules \ mysql \ lib \ protocol \ sequences \ Sequence.js:47:14) 在Query.ErrorPacket上(C:\ wamp64 \ www \ node \ node_modules \ mysql \ lib \ protocol \ sequences \ Query.js:77:18) 在Protocol._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) 在套接字。 (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(events.js:223:5) 在addChunk(_stream_visible.js:309:12) -------------------- 在Protocol._enqueue(C:\ wamp64 \ www \ node \ node_modules \ mysql \ lib \ protocol \ 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:未处理的承诺拒绝。该错误是由于在没有catch块的情况下抛出异步函数而引起的,或者是由于拒绝了未经.catch()处理的诺言而引起的。 (拒绝ID:1) (节点:15728)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

1 个答案:

答案 0 :(得分:1)

我看到了常见的问题:

1)永远不要在请求时间建立与数据库的连接。

2)您的数据库类允许使用带有args替换的promise(在我的示例中为?符号),因此使用它会更安全。

您说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});
    }
  });