#mysql #node.js
#mysql #node.js
Вопрос:
Я работаю над базовым промежуточным программным обеспечением аутентификации для используемого им API Node.js Mysql но если кто-то вводит неправильный ключ в заголовок auth и отправляет запрос, весь 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)
Ответ №1:
Вам также нужно будет проверить result
, действительно ли ваш файл содержит какие-либо строки.
Запрос, не возвращающий ни одной строки, не является ошибкой, поэтому err
не будет установлен, если result
это пустой массив. И доступ к элементу по индексу, который не существует, приводит к 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);
});
}