我正在使用无服务器的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下面使用moudle。 https://www.npmjs.com/package/mysql
提前致谢!!
答案 0 :(得分:1)
默认情况下,Javascript是同步的,但是当你编写异步(回调/保证/异步)代码时,你需要正确处理它。
在您的代码中,有2个问题
module.exports.message =
功能console.log(&#39;完成&#39;)不会等待search._search
。Db.query
,您在每次迭代中的解决承诺。这应该起作用=&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');
})
});