0

I hope, you can help me with my async-await-issue..

I want so search in several databases, concat the results and return them as a json via express. It seems, that my "await db.query("SELECT..")" does not wait till the result arrived.

This is my DummySearchModule.js

const mysql = require('mysql');

const SearchModuleInterface = require('./SearchModuleInterface');
const SearchResult = require('./SearchResult');

class DummySearchModule extends SearchModuleInterface {
    constructor() {
        super();

        var outer = this;
        this.db = mysql.createConnection({
            host: "127.0.0.1",
            user: "db_user",
            password: "db_pw",
            database: "global_search"
          });

          this.db.connect(function(err) {
            if (err) throw err;
            console.log("Connected!");
        });
    }

    
    async search(search_term) {
        var resultSet = [];
        const dbResult = await this.db.query(`SELECT id, title, content, description FROM demo_entries`);
        console.log("dbResult from db:");
        console.log(dbResult[0]);
        for(var element in dbResult[0]) {
            var result = new SearchResult();
            result.title = element.title;
            result.description = element.description;
            result.content = element.content;
            result.date = Date.now();
            
            console.log("title: " + element.title + ":: content: " + element.content);
            resultSet.push(result);
        }

        console.log(resultSet);
        return resultSet;
    };
   
}

module.exports = DummySearchModule;

and this is my frontend-server.js

const express = require("express");
var dateFormat = require('dateformat');

const dummysearchmodule = require('./objects/DummySearchModule');

const server_port = 3000;
const search_modules = [new dummysearchmodule()];
[...]

    app.get("/search/:search_term", (req, res, next) => {
    search_modules.forEach(function(item, index, array) {
        var results = item.search(req.params.search_term);
       resultSet = searchInEveryModuleWithSearchterm(search_term); 
    });

    res.json(resultSet);
});

And this is my output, and i don't know, why I get this..

Connected!
dbResult from db:
<ref *1> Query {
  _events: [Object: null prototype] {
    error: [Function (anonymous)],
    packet: [Function (anonymous)],
    timeout: [Function (anonymous)],
    end: [Function (anonymous)]
  },
  _eventsCount: 4,
  _maxListeners: undefined,
  _callback: [Function (anonymous)],
  _callSite: Error
      at Protocol._enqueue (\frontend\node_modules\mysql\lib\protocol\Protocol.js:144:48)
      at Connection.query (\frontend\node_modules\mysql\lib\Connection.js:198:25)
      at DummySearchModule.search (\frontend\objects\DummySearchModule.js:27:40)
      at \frontend\frontend-server.js:25:31
      at Array.forEach (<anonymous>)
      at searchEveryModuleForResultWithSearchTerm (\frontend\frontend-server.js:24:20)
      at \frontend\frontend-server.js:17:20
      at Layer.handle [as handle_request] (\frontend\node_modules\express\lib\router\layer.js:95:5)
      at next (\frontend\node_modules\express\lib\router\route.js:137:13)
      at Route.dispatch (\frontend\node_modules\express\lib\router\route.js:112:3),
  _ended: false,
  _timeout: undefined,
  _timer: Timer { _object: [Circular *1], _timeout: null },
  sql: 'SELECT id, title, content, description FROM demo_entries',
  values: undefined,
  typeCast: true,
  nestTables: false,
  _resultSet: null,
  _results: [],
  _fields: [],
  _index: 0,
  _loadError: null,
  _connection: <ref *2> Connection {
    _events: [Object: null prototype] {},
    _eventsCount: 0,
    _maxListeners: undefined,
    config: ConnectionConfig {
      host: '127.0.0.1',
      port: 3306,
      localAddress: undefined,
      socketPath: undefined,
      user: 'remote_user',
      password: 'global_search',
      database: 'global_search',
      connectTimeout: 10000,
      insecureAuth: false,
      supportBigNumbers: false,
      bigNumberStrings: false,
      dateStrings: false,
      debug: undefined,
      trace: true,
      stringifyObjects: false,
      timezone: 'local',
      flags: '',
      queryFormat: undefined,
      pool: undefined,
      ssl: false,
      localInfile: true,
      multipleStatements: false,
      typeCast: true,
      maxPacketSize: 0,
      charsetNumber: 33,
      clientFlags: 455631,
      protocol41: true
    },
    _socket: Socket {
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: null,
      _readableState: [ReadableState],
      [Symbol(kSetNoDelay)]: false,
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: Timeout {
        _idleTimeout: -1,
        _idlePrev: null,
        _idleNext: null,
        _idleStart: 174,
        _onTimeout: null,
        _timerArgs: undefined,
        _repeat: null,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0
    },
    _protocol: Protocol {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      readable: true,
      writable: true,
      _fatalError: null,
      _quitSequence: null,
      _handshake: true,
      _handshaked: true,
      _ended: false,
      _destroyed: false,
      _queue: [Array],
      _handshakeInitializationPacket: [HandshakeInitializationPacket],
      _parser: [Parser],
      [Symbol(kCapture)]: false
    },
    _connectCalled: true,
    state: 'authenticated',
    threadId: 23,
    [Symbol(kCapture)]: false
  },
  [Symbol(kCapture)]: false
}

If I log the output in the query function query("SELECT ..", (err, res, fields) => console.log(res);}, I get the correct output. My mysql-server is running in a docker-container.

Does anyone have any clue, o how I can archive my goal? Thanks a lot!!!

1

1 Answer 1

2

My understanding is that mysql does not support await/async out-of-the-box. You can try mysql2 instead (it is almost completely compatible with mysql API), for example it has a promise wrapper which you can use and have all these await/async

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.