私が修正できない小さな問題。 Node v8.1.1を使用していて、async/awaitを使用しようとしましたが、機能しません。コードスニペットは次のようになります。
const axios = require('axios');
const TOKEN = '...';
const httpClient = axios.create({
baseURL : 'https://myhost/api/',
headers : {
'Authorization': `Token ${TOKEN}`
}
});
try {
const resp = await httpClient.get('users?limit=200');
} catch(e) {
console.error(`Fail !\n${e}`);
}
そして、それを実行しようとすると、このエラーメッセージが表示され、何も起こりません:
/Users/mathieu/workspaces/galactic-tools/index.js:13
const resp = await httpClient.get('users?limit=200');
^^^^^^^^^^
SyntaxError: Unexpected identifier
at createScript (vm.js:74:10)
at Object.runInThisContext (vm.js:116:10)
at Module._compile (module.js:533:28)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:503:32)
at tryModuleLoad (module.js:466:12)
at Function.Module._load (module.js:458:3)
at Function.Module.runMain (module.js:605:10)
at startup (bootstrap_node.js:158:16)
at bootstrap_node.js:575:3
非同期/待機はNodeバージョン8では直接サポートされているはずですよね?疑わしいことに、私はnode --harmony-async-await index.js
とnode --harmony index.js
で実行しようとしましたが結果はありませんでした。
Node8でasync/awaitがサポートされているかどうかはわかりませんが、try/catchを次のような関数でラップしてみることができます。
async function callService() {
try {
const resp = await httpClient.get('users?limit=200');
} catch(e) {
console.error(`Fail !\n${e}`);
}
}
callService()
どのブロックが非同期動作をするかが明確である必要があるためです。また、これが機能するためには、httpClient.get()がPromise
を返す必要があります。そうであることを確認してください。
async/awaitはノードv8.xでサポートされています。ただし、awaitはasync関数内にある必要があります。彼らは常にペアで来ます。