我正在为dialogflow设置一个webhook,以使我的机器人可以访问我的mysql数据库中的数据。我已经使用了promises,一切都很好,但是它总是只返回一个包含数据的表,因此使用它非常简单。
我正在为dialogflow设置一个webhook,以使我的机器人可以访问我的mysql数据库中的数据。我已经使用了promises,一切都很好,但是它总是只返回一个包含数据的表,因此使用它非常简单。
现在,我做出了这样的承诺:将所有帖子的详细信息存储在一个表中,除了存储在其他位置的图片网址。我使用第一个承诺返回的ID做出了第二个承诺。我试图嵌套它们,但是它不起作用,我已经阅读了有关诺言链的信息,但是我不太了解它在我的情况下是如何工作的。
这是第一个根据这些参数返回一堆产品的承诺
function getRecommendationCallback(gender,type,size,color,priceMin,priceMax){
return new Promise((resolve,reject)=>{
console.log('Inside getRecommendationCallback');
try{
mysqlConnection.connect((err)=>{
if(!err){
console.log('DB connection succeeded.');
console.log('passed contextparameters : '+ gender + ' ' + type + ' '+size+ ' ' +color+ ' '+priceMin+' '+priceMax);
mysqlConnection.query(`SELECT p.ID as product_id, p.post_title,p.post_name,p.guid,post_content,
max( CASE WHEN pm.meta_key = 'product_gender' and p.ID = pm.post_id THEN pm.meta_value END ) as product_gender,
max( CASE WHEN pm.meta_key = '_price' and p.ID = pm.post_id THEN pm.meta_value END ) as price,
max( CASE WHEN pm.meta_key = 'product_color' and p.ID = pm.post_id THEN pm.meta_value END ) as product_color,
max( CASE WHEN pm.meta_key = 'product_category' and p.ID = pm.post_id THEN pm.meta_value END ) as product_category,
max( CASE WHEN pm.meta_key = 'product_size' and p.ID = pm.post_id THEN pm.meta_value END ) as product_size
FROM
wp_posts p
join wp_postmeta pm on p.ID = pm.post_id
group by
p.ID
HAVING
product_gender = ? AND product_category = ? AND price BETWEEN ? AND ? OR product_size = ? OR product_color = ?`,[gender,type,priceMin,priceMax,size,color],
(error,rows,fields)=>{
if(!error){
console.log(rows);
resolve(rows);
}
else{
console.log(error);
reject(rows);
}
});
}
else{
console.log('DB connection failed.');
}
});
}catch(err){
let results = 'error in try-catch';
console.log(results);
reject(results);
}
});
}
这是第二个承诺,使用第一个承诺中的postID作为参数
function getRecommendationUrlCallback(postId) {
return new Promise((resolve, reject) => {
console.log('Inside getImageUrlCallBack');
try {
mysqlConnection.connect((err) => {
if (!err) {
console.log('DB connection succeeded.');
console.log('passed parameters postID: ' + postId);
mysqlConnection.query(`SELECT concat((select option_value from wp_options where option_name ='siteurl' limit 1),'/wp-content/uploads/',childmeta.meta_value) as url
FROM wp_postmeta childmeta
INNER JOIN wp_postmeta parentmeta ON (childmeta.post_id=parentmeta.meta_value)
WHERE parentmeta.meta_key='_thumbnail_id' and childmeta.meta_key = '_wp_attached_file'
AND parentmeta.post_id = ? ;`, [postId],
(error, rows, fields) => {
if (!error) {
console.log(rows);
resolve(rows);
} else {
console.log(error);
reject(rows);
}
});
} else {
console.log('DB connection failed.');
}
});
} catch (err) {
let results = 'error in try-catch';
console.log(results);
reject(results);
}
});
}
这就是我如何称呼它们,但是由于返回,所以它不起作用,因此被调用的Promise之后的所有内容都不会执行
function recommendation(agent){
return getRecommendationCallback(genderContext, typeClothingContext, sizeContext, colorContext, priceMinContext, priceMaxContext).then((rows) => {
if (rows.length > 0) {
for (var i = 0; i < rows.length; i++) {
//getProductUrl
return getRecommendationUrlCallback(rows[i].id).then((row)=>{
if(row.length > 0)
const imgUrl = row[0].url;
}).catch((error) => {
console.log('In catch ERROR::: ' + error);
agent.add('Unfortunately , we have problems on our side, please try again');
});
agent.add(new Card({
title: rows[i].post_title,
imageUrl: url,
text: rows[i].post_content,
buttonText: 'Shop now!',
buttonUrl: 'localhost:3000/MLAssist/?product=' + rows[i].post_name
}));
}
} else {
agent.add(`Unfortunately we don't have exactly what you're looking for. But don't worry our shop has many other products you may like!`);
}
}).catch((error) => {
agent.add('Unfortunately , we have problems on our side, please try again');
});
}
很抱歉,如果很多,将不胜感激