Node.js NodeJs POST请求ER\u数据\u过长
我正在尝试向网站添加帖子请求,但我不理解收到的错误。我发送了四个文本元素,我确信它们是正确的(大小、类型),并且我在数据库中手动添加了一个元素,没有问题。这不是我的网站,我真的不知道它是如何工作的,所以我复制了另一个请求。但是错误是我的一个元素太长了,事实并非如此,所以我有点困惑 这是我的发帖要求Node.js NodeJs POST请求ER\u数据\u过长,node.js,post,request,Node.js,Post,Request,我正在尝试向网站添加帖子请求,但我不理解收到的错误。我发送了四个文本元素,我确信它们是正确的(大小、类型),并且我在数据库中手动添加了一个元素,没有问题。这不是我的网站,我真的不知道它是如何工作的,所以我复制了另一个请求。但是错误是我的一个元素太长了,事实并非如此,所以我有点困惑 这是我的发帖要求 app.post("/api/addOS" , function(req, res) { if(!(apikeys[req.query.username]===req.query.apikey
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可能未经处理的拒绝:{“数据”:null,“状态”:-1,“配置”:{“方法”:“POST”,“transformRequest”:[null],“transformResponse”:[null],“jsonpCallbackParam”:“回调”,“url”:“>3Jocv”,“头”:{“接受”:“应用程序/json,文本/plain,/”,“名称”:“测试”,“缩写”,“测试”,“类型”:“os”,“couleur”:“tre”},“状态文本”:
我控制台上的就是这个
(节点:15728)未处理的PromisejectionWarning:错误:ER_DATA_过长:第1行“abbr”列的数据过长
在Query.Sequence.\u packetToError(C:\wamp64\www\node\node\u modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
在Query.ErrorPacket(C:\wamp64\www\node\node\u modules\mysql\lib\protocol\sequences\Query.js:77:18)
at Protocol.\u parsePacket(C:\wamp64\www\node\node\u modules\mysql\lib\Protocol\Protocol.js:291:23)
在Parser.\u parsePacket(C:\wamp64\www\node\node\u modules\mysql\lib\protocol\Parser.js:433:10)
在Parser.write(C:\wamp64\www\node\node\u modules\mysql\lib\protocol\Parser.js:43:10)
在Protocol.write(C:\wamp64\www\node\node\u modules\mysql\lib\Protocol\Protocol.js:38:16)
在插座上。(C:\wamp64\www\node\node\u modules\mysql\lib\Connection.js:91:28)
在插座上。(C:\wamp64\www\node\node\u modules\mysql\lib\Connection.js:525:10)
在Socket.emit(events.js:223:5)
在addChunk(_stream_readable.js:309:12)
--------------------
at协议。\排队(C:\wamp64\www\node\node\u modules\mysql\lib\Protocol\Protocol.js:144:48)
在Connection.query(C:\wamp64\www\node\node\u modules\mysql\lib\Connection.js:201:25)
在C:\wamp64\www\node\app.js:92:29
在新的承诺()
在Database.query(C:\wamp64\www\node\app.js:91:16)
在C:\wamp64\www\node\app.js:379:9
在Layer.handle[作为handle\u请求](C:\wamp64\www\node\node\u modules\express\lib\router\Layer.js:95:5)
下一步(C:\wamp64\www\node\node\u modules\express\lib\router\route.js:137:13)
在Route.dispatch(C:\wamp64\www\node\node\u modules\express\lib\router\Route.js:112:3)
在Layer.handle[作为handle\u请求](C:\wamp64\www\node\node\u modules\express\lib\router\Layer.js:95:5)
(节点:15728)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:1)
(节点:15728)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程
我看到了共同层面的问题: 1) 永远不要在请求时创建到数据库的连接 2) 您的数据库类允许使用带有args替换的承诺(
?
符号,在我的示例中),所以使用它,它更安全
您说过abbr
字段是varchar(8)
soreq.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});
}
});
什么类型的
abbr
字段及其长度是多少符号?或者发送的数据长度不要超过2或3个符号(因为test
的长度为4个字符,而abbr
field的长度为4个字符)@num8er abbr的类型为varchar(8)。我也尝试过使用较少的图表,但现在似乎可以工作了。我真的很讨厌5年后不得不收回别人的密码。问题总是很奇怪。