Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8691

社内ネットワークからIBM Watsonにつながらない

$
0
0

はじめに

社内ProxyのおかげでIBM WatsonのAPIが通らかったので対処法を記載します。
(今回はWatson Discoveryです)

結論

node-sdkのところに書いてありました。:open_hands:
Use behind a corporate proxy

npm install tunnel

前提条件

  • Node v10.16.3
  • npm v6.9.0
  • IBM CloudのWatsonDiscoveryのサービスが既にあり、collectionが作成済みであること

Discoveryについてはこちらの記事が参考になると思います。
Discoveryってなんぞ?という方はまずこちらの記事を見ることをおすすめします。
【2019/2月 全面更新!】Watson Discovery Serviceが日本語対応したので、触ってみた【SDUやってみた】編

社内ProxyのせいでAPIが通らないのなら、Nodeやnpmもインストールできないのでは・・・?
というご意見はごもっともですが、Node,npmはすでに実行できるという前提でお願いします。今回はあくまでIBM Watsonに焦点を当てます。

まずはWatsonのAPIを実行してみる

好きなディレクトリにて

npm init

何か聞かれますがすべてEnterでOK

Watson APIs Node.js SDK のインストール

Discoveryのインスタンスをクリックすると次のような画面が出ると思います。
その画面のAPIリファレンス→Nodeタブへ移ると記載があります
top.png
apire.png

npm install ibm-watson@^5.7.0

APIの実行

まずは簡単に今あるCollectionのリストを表示してみましょう。

APIリファレンスでは左側のMethods>Collection>List collectionのところに記載があります。
丁寧に右側にExample requestがあり、クリックでコピーができるようになっているのでコピーしましょう。
実行するファイルは適当にcollection.jsにします。

collection.js
constDiscoveryV1=require('ibm-watson/discovery/v1');const{IamAuthenticator}=require('ibm-watson/auth');constdiscovery=newDiscoveryV1({version:'2019-04-30',authenticator:newIamAuthenticator({apikey:'{apikey}',//自身の情報に書き換え}),serviceUrl:'{url}',//自身の情報に書き換え});constlistCollectionsParams={environmentId:'{environment_id}',//自身の情報に書き換え};discovery.listCollections(listCollectionsParams).then(listCollectionsResponse=>{console.log(JSON.stringify(listCollectionsResponse,null,2));}).catch(err=>{console.log('error:',err);});

しかし、このままでは実行してもエラーが出てしまいます。
どこのDiscoveryのどのインスタンスに対してAPIを呼ぶかが記載されていないからです。
上記ソースコードの「//自身の情報に書き換え」をそれぞれ書き換えます(中括弧もいらない)

apikey,url
api,url.png

environment_id
environ.png

書き換えた後に実行

node collection.js

そうすると無事エラーが返ってきます。:v:

error: { Error: connect ETIMEDOUT 23.41.93.168:443
    at RequestWrapper.formatError (xxxxxxxxxx\node_modules\ibm-cloud-sdk-core\lib\request-wrapper.js:224:21)
    at C:xxxxxxxxxxxxxxx\node_modules\ibm-cloud-sdk-core\lib\request-wrapper.js:212:25
    at process._tickCallback (internal/process/next_tick.js:68:7)
  message: 'connect ETIMEDOUT 23.41.93.168:443',
  statusText: 'ETIMEDOUT',
  body:
   'Response not received - no connection was made to the service.' }

これでAPIを実行する環境ができました。

対処方法

node-sdkのところに書いてありました。:open_hands:
Use behind a corporate proxy
パッケージの「tunnel」を使ってね、とのこと
早速インストール

npm install tunnel

そしてgithubのExampleをみつつ

collection.js
constDiscoveryV1=require("ibm-watson/discovery/v1");const{IamAuthenticator}=require("ibm-watson/auth");consttunnel=require("tunnel");// https AgentconsthttpsAgent=tunnel.httpsOverHttp({proxy:{host:"xxxxxx.com",//httpとかいらないport:8080,},});constdiscovery=newDiscoveryV1({version:"2019-04-30",authenticator:newIamAuthenticator({apikey:"xxxxxxxxxxxxxxxxxxxxxxxxxxxx",httpsAgent,proxy:false,}),httpsAgent,proxy:false,serviceUrl:"https://xxxxxxxxxxxxxx",});constlistCollectionsParams={environmentId:"xxxxxxxxxxxxxxxxxxxxxxxxxxxx",};discovery.listCollections(listCollectionsParams).then((listCollectionsResponse)=>{console.log(JSON.stringify(listCollectionsResponse,null,2));}).catch((err)=>{console.log("error:",err);});

そして実行すると・・・
※idなどの情報はマスクしました

{
  "status": 200,
  "statusText": "OK",
  "headers": {
    "content-type": "application/json;charset=utf-8",
    "access-control-allow-origin": "*",
    "access-control-allow-methods": "GET, PUT, POST, DELETE, OPTIONS",
    "cache-control": "no-cache, no-store, no-transform, max-age=0",
    "pragma": "no-cache",
    "expires": "0",
    "x-content-type-options": "nosniff",
    "x-xss-protection": "1",
    "content-security-policy": "default-src 'none'",
    "access-control-allow-headers": "Origin, Content-Type, Content-Length, Accept, X-Watson-Authorization-Token, X-WDC-PL-OPT-OUT, X-Watson-UserInfo, X-Watson-Learning-Opt-Out, X-Watson-Metadata",
    "strict-transport-security": "max-age=31536000; includeSubDomains;",
    "x-global-transaction-id": "4085110c3d0bc216af495b254da2ab8b",
    "x-dp-watson-tran-id": "4085110c3d0bc216af495b254da2ab8b",
    "content-length": "340",
    "x-edgeconnect-midmile-rtt": "165",
    "x-edgeconnect-origin-mex-latency": "222",
    "date": "Wed, 09 Sep 2020 13:27:25 GMT",
    "connection": "close"
  },
  "result": {
    "collections": [
      {
        "collection_id": "xxxxxxxxxxxxxxxxxxxx",
        "name": "test",
        "configuration_id": "xxxxxxxxxxxxxxxxxxxxx",
        "language": "ja",
        "status": "active",
        "description": null,
        "created": "2020-09-09T12:55:36.283Z",
        "updated": "2020-09-09T12:55:36.283Z"
      }
    ]
  }
}

めでたしめでたし:clap::clap:

終わりに

私が困っているようなことなんて、とっくにほかのだれかが困っていて解決策を出してくれているのできちんと公式のドキュメントをしっかり見よう!!
英語翻訳バンザイ:point_up:

DiscoveryのQueries>Query a collectionではまったとこ

クエリーの返り値フィールドを指定できるパラメーターの書き方がややこしくてはまった。
複数なのでリストかと思っていたら全然違かった。
正しくは下記

constqueryParams={environmentId:'{environment_id}',collectionId:'{collection_id}',_return:'id,metadata.name' //ここ};

Viewing all articles
Browse latest Browse all 8691

Trending Articles