Сделать синхронно с nodejs + mysql на aws без сервера - PullRequest
0 голосов
/ 05 июня 2018

Я использую nodejs без сервера, пытаюсь выполнить запрос к mysql

module.exports.message = (event, context, callback) => {
    const { content } = event;

    let search = new Shop();
    console.log('start');
    search._search(content, (data) => {
        console.log(callback);
        callback(null, data);
    });
    console.log('finish');
});

В магазине класса,

class Shop{
    _search(text, unit = false, callback){
        return this._morphs(text).then(function(data){
            return data;
        })
    }
    _morphs(text, callback){
        return new Promise((resolve, reject) => {
            let result = text.split(" ");
            let query = `SELECT * from shop where name LIKE CONCAT('%', ?, '%')`;
            console.log(1);
            for(let i = 0; i < result.length; i++){
                DB.query(query, result[i], function (data, error) {
                    console.log(2);
                    resolve(data);
                });
            }
         });
    }
}

Когда я выполняю это,

start 1завершение 2 обратного вызова

Это то, что у меня было в журнале.Я хочу выполнить обратный вызов до завершения.так что этот код может вернуть данные.

Я использую ниже MySQL Moudle.https://www.npmjs.com/package/mysql

Заранее спасибо !!

1 Ответ

0 голосов
/ 06 июня 2018

Javascript по умолчанию является синхронным, но когда вы пишете асинхронный (обратный вызов / обещание / асинхронный) код, вам нужно правильно его обработать.

В вашем коде есть 2 проблемы

  1. module.exports.message = Функция console.log ('finish') не будет ждать search._search.
  2. Db.query, ваше обещание разрешения в каждой итерации.

Это должноработа =>

const { promisify } = require('util'); // Node >=8 or use blubird 

promise library promisify
const dbQueryPromise = promisify(DB.query)

class Shop{
    _search(text, unit = false){
        return this._morphs(text);
    }
    async _morphs(text){
        const result = text.split(" ");
        const query = `SELECT * from shop where name LIKE CONCAT('%', ?, '%')`;
        console.log(1);

        const queryResult = []
        for(let i = 0; i < result.length; i++){
            const data = await dbQueryPromise(query, result[i])
            queryResult.push(data);
        }
    }
}


module.exports.message = (event, context, callback) => {
    const { content } = event;

    let search = new Shop();
    console.log('start');
    search._search(content)
        .then((data) => {
            console.log(callback);
            callback(null, data)
        })
        .catch(err => {
            console.log(callback);
            callback(err);
        })
        .finally(() => {

            console.log('finish');
        })
});
...