Как вернуть результаты из MySQL в HAPI

Я новичок в Node и HAPI и работаю над учебниками по базовому API CRUD.

Я пытаюсь выполнить простой SQL-запрос, чтобы получить несколько строк из базы данных и вернуть данные в запросе.

// routes.js
'use strict';
const Path = require('path');
const dbconn = require('./models');
const Home = require ('./controllers/home');

module.exports = [
    {
        method: 'GET',
        path: '/',
        handler: Home,
        config: {
            description: 'Gets all the notes available'
        }
    },

];

// models.js
var db = require('mysql');

const db_name = 'nodejstest';
const db_user = 'nodejstest';
const db_pass = 'n0dejstest()';
const db_host = 'localhost';

var dbconn = db.createConnection({
    host: db_host,
    user: db_user,
    password: db_pass,
    database: db_name
});

dbconn.connect(function(err) {
    if (err) {
        console.error('[mysql error]' + err.stack);
        return;
    }
});


module.exports = dbconn;

// home.js

'use strict';

const dbconn = require('../models');

function getAllNotes(callback) {
    dbconn.query('SELECT * FROM note', [], function (err, results) {
        if (err) {
            throw err;
        }

        console.log(results);

        return callback(results);
    })
}

module.exports = async (request, h) => {
    return getAllNotes(function(results) {
        return {
            data: {
                notes: results
            },
            page: 'Home -- Notes Board',
            description: 'Welcome to my Notes Board'
        };

    })
    
}

В console.log я вижу, что результаты базы данных регистрируются правильно, поэтому я знаю, что база данных возвращает то, что ожидается, но я не могу понять, как заставить Hapi ждать, пока не появятся результаты из базы данных.

Я использую Node v12.18.1 и HAPI 19.1.1.


person Patrick    schedule 23.06.2020    source источник


Ответы (1)


Ваша функция async в Home не возвращает значения обратного вызова. Вы возвращаете результат вызова getAllNotes, который не определен. Вы, кажется, запутались в том, как работают обратные вызовы и асинхронные/промисы. Вы должны обернуть callback для запроса в Promise.

function getAllNotes() {
  return new Promise((resolve, reject) => {
    dbconn.query('SELECT * FROM note', [], function (err, results) {
      if (err) {
        return reject(error)
      }

      console.log(results);

      return resolve(results);
    })
  })
}

module.exports = async (request, h) => {
  // maybe add some error handling here
  const results = await getAllNotes();
  return {
    data: {
      notes: results
    },
    page: 'Home -- Notes Board',
    description: 'Welcome to my Notes Board'
  };
}
person ivanph    schedule 24.06.2020
comment
спасибо! Это сработало отлично, и спасибо за объяснение, почему это тоже не сработало :-) - person Patrick; 24.06.2020