このトピックでは、Node.js 向け Alibaba Cloud SDK の統合と使用に関するよくある質問への回答を提供し、開発効率の向上に役立てます。
前提条件
開発環境に Node.js 8.x 以降がインストールされていること。
ネットワーク経由で Alibaba Cloud API にアクセスできること。
概要
質問と解決策
AccessKey エラーを処理するにはどうすればよいですか?
問題:コードを実行した後に次のエラーメッセージが返されます。このエラーメッセージは、AccessKey ペアが正しく構成されていないことを示しています。
Node.js 向け Alibaba Cloud SDK V2.0:未定義のプロパティを読み取ることができません (reading 'getCredential')。
Node.js 向け Alibaba Cloud SDK V1.0:AssertionError [ERR_ASSERTION]: "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 ID と AccessKey シークレットが ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数と 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...」というエラーメッセージが返された場合はどうすればよいですか?

原因:
PATH 環境変数が正しく構成されていない:グローバルにインストールされた
tscファイルパスが PATH 環境変数に追加されていない。PowerShell 実行ポリシー:デフォルトの PowerShell 実行ポリシーが
Restrictedに設定されている可能性があり、.ps1スクリプトの実行が禁止されている。PATH 環境変数が正しく構成されていない:
tscファイルのグローバルインストールパス(D:\node.js\node_globalなど)が PATH 環境変数に追加されていない。
解決策:
TypeScriptがグローバルにインストールされているかどうかを確認します。npm list -g typescript出力が空であるか、TypeScript がインストールされていないことが示されている場合、TypeScript は正しくインストールされていません。
npm install -g typescriptコマンドを実行して、TypeScript をグローバルにインストールします。次のコマンドを実行して、
npmのグローバルインストールパスをクエリします。npm config get prefix # 出力例: 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 CurrentUserGet-ExecutionPolicyコマンドを再度実行して、実行ポリシーをクエリします。想定される出力はRemoteSignedです。ターミナルで現在のセッションの PATH 環境変数を指定します。
$env:Path += ";D:\node.js\node_global"PATH 環境変数にグローバルパスが含まれているかどうかを確認します。
$env:Path -split ';' | Select-String 'node_global'tscコマンドを実行して、.tsTypeScript ファイルを.jsJavaScript ファイルにコンパイルします(tsconfig.json構成ファイルに基づく)。
例の D:\node.js\node_global パスは、npm config get prefix コマンドによって返される実際のファイルパスに置き換えてください。
API リクエストがタイムアウトし、「Error: connect ETIMEDOUT」メッセージが返された場合はどうすればよいですか?
一般的な原因と解決策:
API 呼び出しのタイムアウトは、複数の要因によって発生する可能性があります。次のセクションでは、一般的な原因と対応する解決策について説明します。
原因 1:ネットワーク接続の問題
原因:クライアントとサーバー間のネットワーク接続が失敗したか、ネットワークが不安定なため、リクエストがサーバーに到達できません。
解決策:
ping コマンドまたは curl コマンドを実行して、オンプレミスホストとクラウドサービスのエンドポイント間の接続性をテストします。たとえば、ping dysmsapi.aliyuncs.com コマンドまたは curl -v https://dysmsapi.aliyuncs.com コマンドを実行して、オンプレミスホストとショートメッセージサービス(SMS) API のエンドポイント間の接続性をテストします。
コマンドがタイムアウトした場合、または応答を受信しない場合は、オンプレミスのファイアウォールまたはルーターでブロックポリシーを確認してください。
応答が返された場合は、不適切なタイムアウト構成によってリクエストが失敗するのを防ぐため、適切なタイムアウト期間を指定することをお勧めします。 詳細については、「タイムアウト期間を構成する」をご参照ください。サンプルコード:
JavaScript
// RuntimeOptions インスタンスを作成し、ランタイムパラメータを指定します。 const runtime = new RuntimeOptions({ // 接続リクエストのタイムアウト期間を構成します。 connectTimeout: 10000, });TypeScript
// RuntimeOptions インスタンスを作成し、ランタイムパラメータを指定します。 const runtime = new $Util.RuntimeOptions({ // 接続リクエストのタイムアウト期間を構成します。 connectTimeout: 10000, });
原因 2:リクエストの処理に時間がかかっている
説明:API リクエストの処理時間が、指定された読み取りタイムアウト期間を超えています。
解決策:API の応答時間の延長に対応するようにタイムアウト期間を構成します。 詳細については、「タイムアウト期間を構成する」をご参照ください。たとえば、読み取りタイムアウトパラメータを構成して、読み取りタイムアウト期間を延長できます。サンプルコード:
JavaScript
// RuntimeOptions インスタンスを作成し、ランタイムパラメータを指定します。
const runtime = new RuntimeOptions({
// 読み取りリクエストのタイムアウト期間を構成します。
readTimeout: 10000,
});TypeScript
// RuntimeOptions インスタンスを作成し、ランタイムパラメータを指定します。
const runtime = new $Util.RuntimeOptions({
// 読み取りリクエストのタイムアウト期間を構成します。
readTimeout: 10000,
});API 操作を呼び出したときに「MissingRequiredParameter」エラーが報告された場合はどうすればよいですか?
この例では、ショートメッセージサービス (SMS) サービスの SendSms 操作が呼び出されます。
OpenAPI Explorer にログオンします。 呼び出す Alibaba Cloud サービスの 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 操作がサポートされていないため API 操作の呼び出しに失敗し、「getaddrinfo ENOTFOUND」メッセージが返された場合はどうすればよいですか?
選択したリージョンで、アクセスするサービスがサポートされていることを確認します。 OpenAPI Explorer の製品ホームページでサービスのエンドポイントを見つけます。次の図は、SMS サービスのエンドポイントを見つける方法を示しています。

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 # 予期される出力:https://registry.npmjs.orgnpm install @alicloud/XXXコマンドを実行して、Alibaba Cloud SDK をインストールします。
Alibaba Cloud イメージソースを確認します。 次のコマンドを実行して、一時的に目的のイメージソースに切り替えます (オプション)。
# この例では、SMS SDK がインストールされています。 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 install基本的な Node.js 例外のチェックリスト
エラーメッセージ | 考えられる原因 | 解決策 |
TypeError | 変数または式の型が予期されたものと一致しません。 | 変数または式の型が予期されたとおりであることを確認します。 条件付きステートメントまたは type of などの型チェックメソッドを使用して、この例外を処理できます。 |
SyntaxError | コードの構文が無効です。 | コードの構文が正しいことを確認します。 コードエディタまたは開発ツールを使用して、構文エラーを検出して修正できます。 |
ReferenceError | 参照される変数が存在しません。 | 参照する変数が定義および初期化されていることを確認します。 条件付きステートメントまたは例外処理メカニズムを使用して、この例外を処理できます。 |
RangeError | 指定された値が有効な範囲外です。 たとえば、配列インデックスが範囲外であるか、再帰関数が何度も呼び出されています。 | 配列インデックスや再帰関数の深さなど、指定された値が有効な範囲内であることを確認します。 条件付きステートメントまたは例外処理メカニズムを使用して、この例外を処理できます。 |
URIError | URI が無効であるか、エンコード中にエラーが発生しました。 | 関連する仕様に従って有効な URI を使用しているか、エンコードが実行されていることを確認します。 条件付きステートメントまたは特定の URI エンコードメソッドを使用して、この例外を処理できます。 |
テクニカルサポート
上記の課題に対する解決策は、Alibaba Cloud SDK をより適切に使用するために役立ちます。 その他の問題が発生した場合は、次の方法で Alibaba Cloud テクニカルサポートに連絡できます。