Ruby后端启动时出现DialogFlow CX SessionsClient未初始化错误
Ruby启动Dialogflow CX后端时出现NameError:未初始化常量Google::Cloud::Dialogflow::CX::SessionsClient
错误日志
app.rb:7:in `<main>': uninitialized constant Google::Cloud::Dialogflow::CX::SessionsClient (NameError) dialogflow = Google::Cloud::Dialogflow::CX::SessionsClient.new(credentials: 'resumechatbot-402917-c4515d65b60f.json')
后端代码
require 'sinatra' require 'sinatra/base' require 'sinatra/reloader' if development? require 'securerandom' require 'google/cloud/dialogflow/cx' dialogflow = Google::Cloud::Dialogflow::CX::SessionsClient.new(credentials: 'resumechatbot-402917-c4515d65b60f.json') VUE_FRONTEND_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', 'vue-frontend', 'dist')) class App < Sinatra::Base get '/' do File.read(File.join(VUE_FRONTEND_DIR, 'index.html')) end get '/js/*' do |path| send_file File.join(VUE_FRONTEND_DIR, 'js', path) end get '/css/*' do |path| send_file File.join(VUE_FRONTEND_DIR, 'css', path) end post '/dialogflow' do request_body = JSON.parse(request.body.read) user_message = request_body['message'] session_id = SecureRandom.uuid begin response = dialogflow.detect_intent( session: "hardwiredRNsoIremoved", query_input: { text: { text: user_message, language_code: 'en-US', }, }, ) bot_message = response.query_result.fulfillment_text { message: bot_message }.to_json rescue StandardError => e { error: e.message }.to_json end end run App.run! end
已安装的相关Gems
google-cloud-core (1.6.0) google-cloud-dialogflow-cx (1.0.0) google-cloud-dialogflow-cx-v3 (0.22.0) google-cloud-env (1.6.0) google-cloud-errors (1.3.1) google-cloud-location (0.6.0) google-protobuf (3.24.4 x64-mingw-ucrt) googleapis-common-protos (1.4.0) googleapis-common-protos-types (1.9.0) googleauth (1.8.1) grpc (1.59.0 x64-mingw-ucrt)
问题原因及解决办法
原因
你安装的google-cloud-dialogflow-cx版本为1.0.0,属于较旧版本,该版本的客户端类命名空间与你代码中使用的Google::Cloud::Dialogflow::CX::SessionsClient不匹配;同时你还安装了google-cloud-dialogflow-cx-v3,但代码中未正确引用v3版本的命名空间。
解决步骤
更新gem到最新版本
运行命令升级google-cloud-dialogflow-cx:gem update google-cloud-dialogflow-cx新版本会统一命名空间,避免版本冲突。
修正代码中的命名空间与require路径
如果暂时不想更新版本,可修改代码中的引用和客户端初始化:# 替换原有的require语句 require 'google/cloud/dialogflow/cx/v3' # 使用v3版本的客户端类 dialogflow = Google::Cloud::Dialogflow::CX::V3::SessionsClient.new(credentials: 'resumechatbot-402917-c4515d65b60f.json')检查客户端初始化位置
建议将dialogflow客户端的初始化放到Sinatra类的初始化方法中,避免在全局作用域提前加载导致的加载顺序问题:class App < Sinatra::Base before do @dialogflow ||= Google::Cloud::Dialogflow::CX::V3::SessionsClient.new(credentials: 'resumechatbot-402917-c4515d65b60f.json') end # ... 其他路由代码 ... post '/dialogflow' do # 使用@dialogflow代替全局变量 response = @dialogflow.detect_intent(...) # ... 后续代码 ... end end
内容的提问来源于stack exchange,提问作者radriaansNES
相关产品推荐
相关产品推荐

