Javascript 为什么当我在node js中创建post调用时,Watson对话会为任何请求返回相同的默认响应

Javascript 为什么当我在node js中创建post调用时,Watson对话会为任何请求返回相同的默认响应,javascript,node.js,ibm-watson,watson-conversation,watson,Javascript,Node.js,Ibm Watson,Watson Conversation,Watson,我已经在对话服务中创建了一个示例培训数据,现在我正在尝试使用node js为该服务创建一个post呼叫,以创建一个聊天应用程序。我创建了一个post呼叫,它正在工作,但没有按预期进行。它为我提供了任何呼叫的默认响应 我知道我们需要传递在下一个调用的响应中得到的上下文值来进行流程,但不确定如何做到这一点。有人能帮我吗。下面是我的代码 var express = require('express'); var conversationV1 = require('watson-developer-cl

我已经在对话服务中创建了一个示例培训数据,现在我正在尝试使用node js为该服务创建一个post呼叫,以创建一个聊天应用程序。我创建了一个post呼叫,它正在工作,但没有按预期进行。它为我提供了任何呼叫的默认响应

我知道我们需要传递在下一个调用的响应中得到的上下文值来进行流程,但不确定如何做到这一点。有人能帮我吗。下面是我的代码

var express = require('express');
var conversationV1 = require('watson-developer-cloud/conversation/v1');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: false
}));
var conversation = new conversationV1({
    username: 'xxxxxx-1a06-4a90-xxxxx-xxxxxxxxxxx',
    password: 'xxxxxxxxxx',
    version_date: conversationV1.VERSION_DATE_2016_09_20
});
const updateMessage = (input, response) => {
    var responseText = null;
    if (!response.output) {
        response.output = {};
    } else {
        return response;
    }
    if (response.intents && response.intents[0]) {
        var intent = response.intents[0];
    if (intent.confidence >= 0.75) {
        responseText = 'I understood your intent was ' + intent.intent;
    } else if (intent.confidence >= 0.5) {
        responseText = 'I think your intent was ' + intent.intent;
    } else {
        responseText = 'I did not understand your intent';
    }
}
response.output.text = responseText;
return response;
};

app.post('/api/message', (req, res, next) => {
    const workspace = '254654de-2bfe-423a-92ec-6aa66620625a'; 
    if (!workspace || workspace === '<workspace-id>') {
        return res.json({
            output: {
                text: 'Please check the workspace'
            }
        });
    }
    const payload = {
        workspace_id: workspace,
        input: req.body.input || {},
        context: req.body.context || {}
    };

    // Send the input to the conversation service
    conversation.message(payload, (error, data) => {
        if (error) {
            return next(error);
        }
        return res.json(updateMessage(payload, data));
    });
});

app.listen(process.env.PORT || 3000);

exports.app = app
var express=require('express');
var conversationV1=require('watson-developer-cloud/conversation/v1');
var bodyParser=require('body-parser');
var-app=express();
use(bodyParser.json());
app.use(bodyParser.urlencoded({
扩展:false
}));
var对话=新对话v1({
用户名:“xxxxxx-1a06-4a90-xxxxx-XXXXXXXXXX”,
密码:“XXXXXXXXX”,
版本日期:conversationV1.version日期2016年09月20日
});
const updateMessage=(输入,响应)=>{
var responseText=null;
if(!response.output){
response.output={};
}否则{
返回响应;
}
if(response.intents&&response.intents[0]){
var intent=response.intents[0];
如果(意向信心>=0.75){
responseText='我知道你的意图是'+intent.intent;
}否则如果(intent.confidence>=0.5){
responseText='我认为你的意图是'+intent.intent;
}否则{
responseText='我不明白你的意图';
}
}
response.output.text=responseText;
返回响应;
};
app.post('/api/message',(req,res,next)=>{
常数工作空间='254654de-2bfe-423a-92ec-6aa66620625a';
如果(!workspace | | workspace==“”){
返回res.json({
输出:{
文本:“请检查工作区”
}
});
}
常数有效载荷={
工作区\u id:workspace,
输入:req.body.input | |{},
上下文:req.body.context | |{}
};
//将输入发送到对话服务
消息(有效负载,(错误,数据)=>{
如果(错误){
返回下一个(错误);
}
返回res.json(updateMessage(有效负载、数据));
});
});
app.listen(process.env.PORT | | 3000);
exports.app=app

有人能帮助我如何传递上下文以使其工作吗..有人能帮助吗.你可以在本地运行代码进行测试。

每当你发布到api/消息端点时,你都需要发送上下文。第一次你就没有了背景。上下文将由Watson对话创建并返回,然后在此响应中返回:
res.json(updateMessage(payload,data))

返回的JSON对象应该具有上下文属性。调用方需要存储该上下文,然后在下一次调用中发布它。因此,调用方代码应该如下所示(伪代码):

第一次呼叫:

resp = POST api/message {}
ctxt = resp.context
resp = POST api/message {context: ctxt}
ctxt = resp.context
存储上下文:

resp = POST api/message {}
ctxt = resp.context
resp = POST api/message {context: ctxt}
ctxt = resp.context
下一次呼叫:

resp = POST api/message {}
ctxt = resp.context
resp = POST api/message {context: ctxt}
ctxt = resp.context
存储上下文(每次):

resp = POST api/message {}
ctxt = resp.context
resp = POST api/message {context: ctxt}
ctxt = resp.context
始终使用服务器返回的上下文更新调用方中的上下文。每当你有一个新用户,你就重新开始


您没有为调用方显示任何代码,因此我不确定这是否是您的问题。

我也有同样的问题。以下是我所做的:

app.post('/api/message', function (req, res) {
var workspace = process.env.WORKSPACE_ID || '<workspace-id>';
if (!workspace || workspace === '<workspace-id>') {
return res.json({
  'output': {
    'text': 'Config workspace'
  }
});
}

var context;

var payload = {
workspace_id: workspace,
context: {},
input: {}
};

if (req.body) {
if (req.body.input) {
  payload.input = req.body.input;
}
if (req.body.context) {
  // The client must maintain context/state
  payload.context = req.body.context;
}
}

conversation.message(payload, function (err, data) {
 if (err) {
   return res.status(err.code || 500).json(err);
 }
 context = data.context;
 return res.json(updateMessage(payload, data));

});
});

function updateMessage(input, response) {
var responseText = null;
if (!response.output) {
response.output = {};
} else {
return response;
}
if (response.intents && response.intents[0]) {
var intent = response.intents[0];
if (intent.confidence >= 0.75) {
  responseText = 'I understood your intent was ' + intent.intent;
} else if (intent.confidence >= 0.5) {
  responseText = 'I think your intent was ' + intent.intent;
} else {
  responseText = 'I did not understand your intent';
}
}
response.output.text = responseText;
return response;
}
module.exports = app;
app.post('/api/message',函数(req,res){
var workspace=process.env.workspace_ID | |“”;
如果(!workspace | | workspace==“”){
返回res.json({
“输出”:{
“文本”:“配置工作区”
}
});
}
var语境;
var有效载荷={
工作区\u id:workspace,
上下文:{},
输入:{}
};
如果(请求正文){
if(请求正文输入){
payload.input=req.body.input;
}
if(请求正文上下文){
//客户端必须维护上下文/状态
payload.context=req.body.context;
}
}
消息(有效负载、功能(错误、数据){
如果(错误){
返回res.status(err.code | | 500).json(err);
}
context=data.context;
返回res.json(updateMessage(有效负载、数据));
});
});
函数更新消息(输入、响应){
var responseText=null;
if(!response.output){
response.output={};
}否则{
返回响应;
}
if(response.intents&&response.intents[0]){
var intent=response.intents[0];
如果(意向信心>=0.75){
responseText='我知道你的意图是'+intent.intent;
}否则如果(intent.confidence>=0.5){
responseText='我认为你的意图是'+intent.intent;
}否则{
responseText='我不明白你的意图';
}
}
response.output.text=responseText;
返回响应;
}
module.exports=app;

如果使用VisualStudio编写代码,则可以检查相同的上下文是否正在通过函数,只需单击上下文单词。我不是职业选手,但这对我很有用。祝你好运

这只是一个简单对话的副本?所以它应该是开箱即用的。我建议确保对话ID没有更改。如果是,则问题在于您的应用程序。如果没有,则问题在于对话,因此您需要在那里进行调试。@SimonO'Doherty对话Id每次都会更改。如果您更改了任何对话简单应用程序,请检查那里。没有足够的内容继续你发布的内容。