このトピックでは、Alibaba Cloud SDK for Node.js の統合と使用に関するよくある質問とその回答をまとめ、開発効率の向上を支援します。
前提条件
開発環境に Node.js 8.x 以降がインストールされていること。
ご利用のネットワークから Alibaba Cloud API に到達可能であること。
概要
tsc コマンドの実行後に「tsc: 用語 'tsc' は、コマンドレット、関数、スクリプト、または実行可能プログラムの名前として認識されません...」というエラーメッセージが返された場合の対処方法
API リクエストがタイムアウトし、「Error: connect ETIMEDOUT」というメッセージが返された場合の対処方法
API オペレーションの呼び出し時に「MissingRequiredParameter」というメッセージが返された場合の対処方法
指定されたリージョンでオペレーションがサポートされていないために API オペレーションの呼び出しに失敗し、「getaddrinfo ENOTFOUND」というメッセージが返された場合の対処方法
質問と解決策
AccessKey エラーの対処方法
問題:コードの実行後に次のエラーメッセージが返されます。このエラーメッセージは、AccessKey ペアが正しく構成されていないことを示しています。
Alibaba Cloud SDK V2.0 for Node.js:Cannot read properties of undefined (reading 'getCredential')。
Alibaba Cloud SDK V1.0 for Node.js:AssertionError [ERR_ASSERTION]: must pass "config.accessKeyId"。
解決策:
次のコマンドを実行して、`ALIBABA_CLOUD_ACCESS_KEY_ID` および `ALIBABA_CLOUD_ACCESS_KEY_SECRET` 環境変数が構成されているかどうかを確認します。
Linux/macOS
echo $ALIBABA_CLOUD_ACCESS_KEY_ID echo $ALIBABA_CLOUD_ACCESS_KEY_SECRETWindows
echo %ALIBABA_CLOUD_ACCESS_KEY_ID% echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%有効な AccessKey ペアが返された場合、環境変数は正しく構成されています。AccessKey ペアが返されないか、無効な AccessKey ペアが返された場合は、必要に応じて環境変数を構成してください。詳細については、「Linux、macOS、Windows で環境変数を構成する」をご参照ください。
-
コード内の AccessKey ペアに関連するエラーを確認します。
リクエスト失敗のサンプル:
let config = new OpenApi.Config({ accessKeyId: process.env['yourAccessKeyID'], accessKeySecret: process.env['yourAccessKeySecret'], });リクエスト成功のサンプル:
let config = new OpenApi.Config({ accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'], accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], });説明process.env['ALIBABA_CLOUD_ACCESS_KEY_ID']とprocess.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET']は、それぞれの環境変数から値を取得する式です。重要セキュリティリスクを防ぐため、オンラインコードに AccessKey ペアを書き込まないでください。
tsc コマンドを実行した後、「tsc: Fail to recognize the tsc command as the name of a cmdlet, a function, a script, or a executable program...」というエラーメッセージが返された場合の対処方法
PS C:\Users\issuser\Downloads\69351a7d-c9ef-417c-8986-a371cd208ece-TypeScript> tsc
tsc : The term 'tsc' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ tsc
+ ~~~
+ CategoryInfo : ObjectNotFound: (tsc:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
原因:
PATH 環境変数が正しく設定されていません:グローバルにインストールされた
tscファイルパスが PATH 環境変数に追加されていません。PowerShell 実行ポリシー: デフォルトの PowerShell 実行ポリシーは
Restrictedに設定されている場合があり、その場合.ps1スクリプトの実行は禁止されます。PATH 環境変数が正しく設定されていません。グローバルにインストールされた
tscファイルパス (D:\node.js\node_globalなど) が PATH 環境変数に追加されていません。
解決策:
TypeScriptがグローバルにインストールされているか確認します:npm list -g typescript出力が空であるか、TypeScript がインストールされていないことを示す場合、TypeScript は正しくインストールされていません。
TypeScript をグローバルにインストールするには、
npm install -g typescriptコマンドを実行します。次のコマンドを実行して、
npmのグローバルインストールパスを確認します:npm config get prefix # Sample output: D:\node.js\node_global返されたパスを次のコマンドに含めて、ディレクトリに
tscファイルが存在するかどうかを確認します:ls D:\node.js\node_global | Select-String 'tsc'次のコマンドを実行して、
PowerShellの実行ポリシーをクエリします:Get-ExecutionPolicy出力が
Restrictedの場合、PowerShell はスクリプトの実行を禁止します。スクリプトの実行を許可するため、実行ポリシーを
RemoteSignedに変更します。Set-ExecutionPolicy RemoteSigned -Scope CurrentUser再度
Get-ExecutionPolicyコマンドを実行して、実行ポリシーをクエリします。期待される出力はRemoteSignedです。ターミナルで現在のセッションの PATH 環境変数を指定します:
$env:Path += ";D:\node.js\node_global"PATH 環境変数にグローバルパスが含まれているか確認します:
$env:Path -split ';' | Select-String 'node_global'tsconfig.json設定ファイルに基づいてtscコマンドを実行し、.tsTypeScript ファイルを.jsJavaScript ファイルにコンパイルします。
例の D:\node.js\node_global パスを、 npm config get prefix コマンドで返される実際のファイルパスに置き換えてください。
API リクエストがタイムアウトし、「Error: connect ETIMEDOUT」というメッセージが返された場合の対処方法
一般的な原因と解決策:
API 呼び出しのタイムアウトは、複数の要因によって引き起こされる可能性があります。以下に、一般的な原因とそれに対応する解決策を説明します。
原因 1:ネットワーク接続の問題
原因:クライアントとサーバー間のネットワーク接続の失敗やネットワークの不安定さにより、リクエストがサーバーに到達できません。
解決策:
オンプレミスホストとクラウドサービスのエンドポイント間の接続性をテストするには、ping または curl コマンドを実行します。たとえば、お使いのオンプレミスホストと Short Message Service (SMS) API のエンドポイント間の接続性をテストするには、ping dysmsapi.aliyuncs.com または curl -v https://dysmsapi.aliyuncs.com コマンドを実行します。
コマンドがタイムアウトするか、応答を受信しない場合は、オンプレミスのファイアウォールまたはルーターのブロッキングポリシーを確認してください。
応答が返された場合は、不適切なタイムアウト構成によるリクエストの失敗を防ぐために、適切なタイムアウト期間を指定することを推奨します。詳細については、「タイムアウト期間の設定」をご参照ください。サンプルコード:
JavaScript
// Create a RuntimeOptions instance and specify runtime parameters. const runtime = new RuntimeOptions({ // Configure a timeout period for connection requests. connectTimeout: 10000, });TypeScript
// Create a RuntimeOptions instance and specify runtime parameters. const runtime = new $Util.RuntimeOptions({ // Configure a timeout period for connection requests. connectTimeout: 10000, });
原因 2:リクエストの処理に時間がかかる
説明:API リクエストの処理時間が、指定された読み取りタイムアウト期間を超えています。
解決策:API の応答時間が長くなることに対応するため、タイムアウト期間を設定します。詳細については、「タイムアウト期間の設定」をご参照ください。たとえば、読み取りタイムアウトパラメーターを設定して、読み取りタイムアウト期間を延長できます。サンプルコード:
JavaScript
// Create a RuntimeOptions instance and specify runtime parameters.
const runtime = new RuntimeOptions({
// Configure a timeout period for read requests.
readTimeout: 10000,
});TypeScript
// Create a RuntimeOptions instance and specify runtime parameters.
const runtime = new $Util.RuntimeOptions({
// Configure a timeout period for read requests.
readTimeout: 10000,
});API オペレーションの呼び出し時に「MissingRequiredParameter」エラーが報告された場合の対処方法
この例では、Short Message Service (SMS) サービスの SendSms オペレーションが呼び出されます。
-
OpenAPI Explorer の API デバッグ ページに移動し、プロダクトと API を選択します。
作成されたリクエストオブジェクトに、phoneNumbers や signName などのすべての必須パラメーターが指定されているかを確認します。この例では、
SendSmsRequestオブジェクトを使用します。API リファレンスに基づいて、すべての必須パラメーターが指定されていることを確認します。
必須パラメーターの値が有効であることを確認します。たとえば、携帯電話番号が有効なフォーマットで指定されているかを確認します。
SDKは、API リクエストを送信する前に、パラメーターを自動的に検証します。必須パラメーターが1つ以上指定されていない場合、
MissingRequiredParameterなどのエラーが報告されます。たとえば、phoneNumbers パラメーターが指定されていない場合、「MissingPhoneNumbers: code: 400」というエラーが報告されます。この場合、エラーメッセージに基づいてパラメーターを指定してください。
JavaScript
let sendSmsRequest = new Dysmsapi20170525.SendSmsRequest({
phoneNumbers: '<YOUR_VALUE>',
signName: '<YOUR_VALUE>',
templateCode: '<YOUR_VALUE>',
});TypeScript
let sendSmsRequest = new $Dysmsapi20170525.SendSmsRequest({
phoneNumbers: "<YOUR_VALUE>",
signName: "<YOUR_VALUE>",
templateCode: "<YOUR_VALUE>",
});指定されたリージョンでオペレーションがサポートされていないために API オペレーションの呼び出しに失敗し、「getaddrinfo ENOTFOUND」というメッセージが返された場合の対処方法
呼び出しているサービスが選択したリージョンで利用可能であることを確認してください。OpenAPI Explorer で正しいサービスエンドポイントを見つけることができます。正しいエンドポイントを使用していることを確認してください。
OpenAPI Explorer の上部ナビゲーションバーで、Short Message Service を選択します。プロダクトのホームページで、[サービスエリアリスト] タブに移動します。エンドポイントのフォーマットは [product_code].[region_id].aliyuncs.com です。この表には、各リージョン ID (cn-beijing、cn-hangzhou、cn-shanghai など) とそれに対応するサービスエンドポイント (dysmsapi.aliyuncs.com など) がリストされています。
npm install コマンドが報告するエラーには、どのように対処すればよいですか?
Node.js と npm が正しくインストールされていることを確認してください。詳細については、「Windows に Node.js をインストールする」をご参照ください。
考えられる原因:
イメージソースの構成に競合があります。グローバル npm 構成では Taobao などのサードパーティのイメージソースが使用されていますが、
@alicloudスコープには独立した公式ソースが構成されていません。キャッシュまたはネットワークの問題により npm のローカルキャッシュが破損しているか、エンタープライズファイアウォールなどのネットワークポリシーがイメージソースへのリクエストをブロックしています。
パッケージバージョンが存在しません。たとえば、指定されたバージョン
3.1.1はイメージソースに存在しません。
解決策:
次のコマンドを実行して npm キャッシュをクリアし、キャッシュの破損を修正してから、SDK を再インストールします。
npm cache clean --force公式の npm ソースを使用します。
@alicloudスコープの公式ソースを設定します。次のコマンドを実行して、@alicloudで始まるパッケージにのみ npm ソースを設定します。npm config set @alicloud:registry=https://registry.npmjs.org次のコマンドを実行して npm 構成を確認し、スコープが有効になっていることを確認します:
npm config get @alicloud:registry # Expected output: https://registry.npmjs.orgnpm install @alicloud/XXXコマンドを実行して、Alibaba Cloud SDK をインストールします。
Alibaba Cloud のイメージソースを確認します。次のコマンドを実行して、一時的に目的のイメージソースに切り替えます (オプション):
# In this example, the SMS SDK is installed. npm install @alicloud/dysmsapi20170525@3.1.1 --registry=https://registry.npmmirror.com
SDK のインストール後、npm から 9 vulnerabilities (6 moderate, 3 high) のようなメッセージが返されます。原因と解決策:
原因:SDK のサードパーティ依存パッケージ、axios や lodash などが古く、既知の脆弱性が含まれています。
解決策: npm audit fix コマンドを実行して、自動エラー修正を開始します。npm は、脆弱性が少ない、またはない互換性のあるバージョンに自動的にアップグレードします。
依存パッケージのバージョン競合の解決方法
npm lsコマンドを実行して依存関係ツリーを表示し、バージョンの競合が発生しないことを確認します。node_modulesディレクトリとpackage-lock.jsonファイルを削除し、依存関係を再インストールします。
rm -rf node_modules package-lock.json
npm installNode.js の基本的な例外のチェックリスト
エラーメッセージ | 考えられる原因 | 解決策 |
TypeError | 変数の型または式が期待を満たしていません。 | 変数の型または式が期待どおりであることを確認します。条件付きステートメントや `typeof` などの型チェックメソッドを使用して、この例外を処理できます。 |
SyntaxError | コードの構文が無効です。 | コードの構文が正しいことを確認します。コードエディタや開発ツールを使用して、構文エラーを検出および修正できます。 |
ReferenceError | 参照された変数が存在しません。 | 参照したい変数が定義され、初期化されていることを確認します。条件付きステートメントや例外処理メカニズムを使用して、この例外を処理できます。 |
RangeError | 指定された値が有効範囲外です。たとえば、配列のインデックスが範囲外であるか、再帰関数が呼び出されすぎています。 | 配列のインデックスや再帰関数の深さなど、指定された値が有効範囲内であることを確認します。条件付きステートメントや例外処理メカニズムを使用して、この例外を処理できます。 |
URIError | URI が無効であるか、エンコーディング中にエラーが発生しました。 | 有効な URI を使用しているか、関連する仕様に従ってエンコーディングが実行されていることを確認します。条件付きステートメントや特定の URI エンコーディング方式を使用して、この例外を処理できます。 |
テクニカルサポート
上記の問題の解決策は、Alibaba Cloud SDK をより良く使用するのに役立ちます。他の問題が発生した場合は、次の方法で Alibaba Cloud のテクニカルサポートに連絡できます。