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