Node.js , Ошибка типа Mysql: не удается прочитать свойство ‘apikey’ неопределенного

#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);
    });
}