Ошибка DialogFlow v2: имя ресурса '' не соответствует 'проектам / * / местоположениям / * / агенту / средам / * / пользователям / * / сеансам * *' - PullRequest
2 голосов
/ 28 октября 2019

Я пытаюсь реализовать собственное окно чата для чат-бота DialogFlow. AFAIK, мне нужно создать сервер для обработки запросов из окна чата, переслать их в DialogFlow для ответа, а затем вернуть этот ответ в окно чата. Я следовал за сэмплом из клиентского SDK DialogFlow Node.js (шаг 6: «Попробуйте пример») и получил следующее:

require('dotenv').config()
const dialogflow = require('dialogflow');
const express = require('express');    

const app = express();
const PORT = process.env.PORT || 3000;    

app.use(express.json());    

const sessionClient = new dialogflow.SessionsClient({
  credentials: {
    client_email: process.env.CLIENT_EMAIL,
    private_key: process.env.PRIVATE_KEY
  }
});    

async function getResponse(req, res) {
  // A unique identifier for the given session
  console.log("body", req.body);
  const sessionId = req.body.session.split('/').pop();    

  // Create a new session
  console.log("session", sessionId)

  const sessionPath = sessionClient.sessionPath(process.env.PROJECT_ID, sessionId);    

  // The text query request.
  const request = {
    session: sessionPath,
    queryInput: {
      text: {
        // The query to send to the dialogflow agent
        text: req.body.queryResult.queryText,
        // The language used by the client (en-US)
        languageCode: 'en-US',
      }
    }
  };    

  console.log("send request", request)
  // Send request and log result
  const responses = await sessionClient.detectIntent(req);
  const result = responses[0].queryResult;
  res.json(result);
}    

app.post('/', getResponse);
app.get('/', (req, res) => res.send('Use POST'));
app.listen(PORT, () => {
  console.log('Server is running on PORT:',PORT);
});

Хотя исходный сэмпл сработал, отправкаPOST-запрос к моему серверу с использованием Postman дает мне эту ошибку:

(node:724) UnhandledPromiseRejectionWarning: Error: 3 INVALID_ARGUMENT: Resource name '' does not match 'projects/*/locations/*/agent/environments/*/users/*/sessions/*'.
    at Object.callErrorFromStatus (C:\Users\rudyt\Documents\Github\metbot-fulfillment\node_modules\@grpc\grpc-js\build\src\call.js:30:26)
    at Http2CallStream.call.on (C:\Users\rudyt\Documents\Github\metbot-fulfillment\node_modules\@grpc\grpc-js\build\src\client.js:96:33)
    at Http2CallStream.emit (events.js:194:15)
    at process.nextTick (C:\Users\rudyt\Documents\Github\metbot-fulfillment\node_modules\@grpc\grpc-js\build\src\call-stream.js:75:22)
    at process._tickCallback (internal/process/next_tick.js:61:11)
(node:724) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:724) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Я не уверен, откуда эта ошибка, есть ли проблема с тем, как я отформатировал запрос в моей функции getResponse или есликак-то это связано с почтальоном? Я делаю запрос (на стороне Почтальона) с POST на http://localhost:3000 с заголовком Content-Type, установленным на application/json, и телом запроса, установленным как необработанный JSON (я вставил в этом примере Webhook запрос ). Я склоняюсь к проблеме, связанной с запросом к DialogFlow, но я включил информацию Почтальона на всякий случай.

1 Ответ

1 голос
/ 05 ноября 2019

Я думаю, что проблема в том, что вы не отправляете то, что, как вы думаете, отправляете на detectIntent().

Предполагая, что этот код предназначен для запуска где-то на сервере, примите запрос из JavaScriptклиент, а затем создать запрос к Dialogflow - вы на самом деле этого не делаете.

Хотя вы создаете запрос (в константе с именем request) и регистрируете его

  // The text query request.
  const request = {
    session: sessionPath,
    queryInput: {
      text: {
        // The query to send to the dialogflow agent
        text: req.body.queryResult.queryText,
        // The language used by the client (en-US)
        languageCode: 'en-US',
      }
    }
  };    

  console.log("send request", request)

когда вы отправляете это в Dialogflow, вы отправляете не объект request, а объект req, полученный от клиента:

const responses = await sessionClient.detectIntent(req);

Вы должны никогда не передавайте что-либо от клиента без предварительной очистки на вашем сервере.

Я подозреваю, что если вы измените это на что-то вроде этого, оно должно работать:

const responses = await sessionClient.detectIntent(request);
...