在aws serverless上与nodejs + mysql同步

时间:2018-06-05 20:40:47

标签: mysql node.js serverless-framework serverless aws-serverless

我正在使用无服务器的nod​​ejs,试图查询到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);
                });
            }
         });
    }
}

当我执行此操作时,

开始 1 完 2 回调

这就是我在日志中所拥有的。我想在完成之前执行回调。所以这段代码可以返回数据。

我在mysql下面使用moudle。 https://www.npmjs.com/package/mysql

提前致谢!!

1 个答案:

答案 0 :(得分:1)

默认情况下,Javascript是同步的,但是当你编写异步(回调/保证/异步)代码时,你需要正确处理它。

在您的代码中,有2个问题

  1. module.exports.message =功能console.log(&#39;完成&#39;)不会等待search._search
  2. Db.query,您在每次迭代中的解决承诺。
  3. 这应该起作用=&gt;

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