我正在使用无服务器的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);
});
}
});
}
}
当我执行这个时
开始
1
完
2
打回来
这就是我在日志中所拥有的。我想在完成之前执行回调。所以这段代码可以返回数据。
我正在使用下面的mysql模块。
https://www.npmjs.com/package/mysql
提前致谢!!
最佳答案
默认情况下,Javascript是同步的,但是当您编写异步(回调/诺言/异步)代码时,您需要正确处理它。
在您的代码中,有2个问题module.exports.message =
函数console.log('finish')不会等待search._search
。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');
})
});