我一直在尝试创建一个聊天机器人,询问心理问题以分析一个人的感受。我在Bluemix中创建了一个聊天机器人,并在本教程的帮助下将其实现为节点红色:https://github.com/watson-developer-cloud/node-red-labs/tree/master/basic_examples/conversation所以我的流程非常相似,另外还有我添加了音调分析器并将其连接到与会话相同的部分。我的主要问题是我似乎无法通过点表示法访问html模板中音调分析器的值,但响应调试显示输入肯定是在分析。如何调整流程或AJAX代码,以便模板允许访问音调分析器值。 (注释掉的代码是我尝试对我的问题进行排序,虽然我并没有特别关注AJAX所以它有点混乱)。
<html> <head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> My BOT </title> <link rel="stylesheet"
type="text/css"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" /> </head> <body>
<div class="container">
<div id="no-script"class="bg-info">
This application needs JavaScript enabled in your browser!
</div>
<div id="id_contextdump"></div>
<h1>My BOT</h1>
<div id=id_botchathistory> </div>
<div>
<form>
<label for="id_chattext">Your Input: </label>
<input type="text" name="chattext" id="id_chattext">
<br/><br/>
</form>
<button onclick="javascript:onChatClick()">Send</button> </div>
</div>
<div id="id_tone">
<table>
<thead>
<tr>
<th>Tone</th>
<th>Score</th>
</tr>
{{#response.document_tone.tone_categories.0.tones}}
<tr>
<td>{{tone_id}}</td>
<td>{{score}}</td>
</tr>
{{/response.document_tone.tone_categories.0.tones}}
</thead>
</table>
</div>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
javascriptCheck();
$('#id_contextdump').hide();
});
// if javascript is enabled on the browser then can
// remove the warning message
function javascriptCheck() {
$('#no-script').remove();
}
function createNewDiv(who, message) {
var txt = who + ' : ' + message;
return $('<div></div>').text(txt);
}
function chat(person, txt) {
$('#id_botchathistory').append(createNewDiv(person, txt));
}
// function updateTone(){ // $('#id_tone').append(createNewDiv(response.document_tone.tone_categories.0.tones)) // }
function processOK(response) {
console.log(response);
console.log(response.botresponse.messageout);
console.log(response.botresponse.messageout.output.text);
console.log(response.botresponse.messageout.context);
chat('Bot', response.botresponse.messageout.output.text);
$('#id_contextdump').data('convContext', response.botresponse.messageout.context);
}
function processNotOK() {
chat('Error', 'Error whilst attempting to talk to Bot');
}
function invokeAjax(message) {
var contextdata = $('#id_contextdump').data('convContext');
console.log('checking stashed context data');
console.log(contextdata);
//var ajaxData = "msgdata=" + message;
var ajaxData = {};
ajaxData.msgdata = message;
if (contextdata) {
ajaxData.context = contextdata;
} // var tone = { // document: {}, // sentence: {} // };
// tone.document = getTones(data.document_tone);
$.ajax({
type: 'POST',
url: 'botchat',
data: ajaxData,
success: processOK,
error: processNotOK
});
}
// User has entered some text.
function onChatClick() {
var txt = $('#id_chattext').val();
chat('You', txt);
invokeAjax(txt); // updateTone();
}
// var tone_analyser = watson.tone_analyzer({ // username: 'e7cc7d78-d63f-42a9-ac1b-c900bbee33a4', // password: '57NyBACkO5s3', // version: 'v3', // version_date: '2016-05-19' // });
// window.setInterval("refreshDiv()", 500); // function refreshDiv(){ // tone_analyser= tone_analyser; // }
</script> </body> </html>
在:
_// stash away incoming data_
msg.mydata = {};
msg.mydata.messagein = msg.req.body.msgdata;
msg.payload = msg.mydata.messagein;
msg.params = { "context": msg.req.body.context};
return msg;
日期:
msg.mydata.messageout = msg.payload;
msg.payload = {};
msg.payload.botresponse = msg.mydata;
return msg;
问题是因为你在in
函数节点之后分叉了流。除非out
函数节点仅在收到2个输入消息后输出,否则这将不起作用。
当你分叉流时,它会顺序运行,而不是并行运行,这是因为NodeJS是完全单线程的。这意味着只有来自Art Attack
节点的结果才会返回到http-out节点并返回到您的页面。
如果不确切知道out
函数节点中的内容,就不可能说明如何解决这个问题。