Node.js, Mysql 类型错误: 无法读取未定义的属性'apikey'



我正在为API开发一个基本的身份验证中间件,它使用Node.js Mysql,但如果有人在身份验证头中放入错误的密钥并发送请求,整个API就会崩溃,这是我的代码,问题是回调,但我不知道如何修复。


var express = require('express');
var app = express();
app.get('/', (request, response) => {
response.sendStatus(200);
});
let listener = app.listen(3000, () => {
console.log('Your app is currently listening on port: ' + listener.address().port);
});

var mysql = require('mysql');
var connection = mysql.createConnection({
host     : '127.0.0.1',
user     : 'root',
database : 'systemdata'
});
connection.connect();

function systemAuth(apikey, callback)
{
connection.query('SELECT apikey FROM systemdata.systemkeys WHERE apikey = ?', [apikey], function(err, result)
{
if (err) 
callback(err,null);
else
callback(null,result[0].apikey);
});
}

var auth = function (req, res, next) {
systemAuth(req.headers.apikey, function(err,data){
if (err) {
console.log("ERROR : ",err);            
} else {            
console.log("result from db is : ",data);
}
if(data == req.headers.apikey) {
next()
}else{
res.status(401).send({"error": "Missing or Invalid API-Key", "apikey": req.headers.apikey, "valid": "false"})
}
})
}
app.use(auth)

您还必须检查result是否真的包含任何行。

不返回任何行的查询不是错误,因此如果result是空数组,则不会设置err。通过不存在的索引访问元素会导致undefined,从而导致您看到的错误。

function systemAuth(apikey, callback)
{
connection.query('SELECT apikey FROM systemdata.systemkeys WHERE apikey = ?', [apikey], function(err, result)
{
if (err) // some error with the query 
callback(err,null);
else if (!result || result.length == 0) // no matching rows found
callback(new Error("invalid apikey"), null);
else // a matching row is found
callback(null,result[0].apikey);
});
}

相关内容

最新更新