前提条件

npmとNode.jsのバージョンは以下の通りとします。

  • npm 5.6.0
  • Node.js v9.8.0

背景

npm公式サイトの、ngrokのページで「usage」を見てみると、

npm install ngrok
const ngrok = require('ngrok');
const url = await ngrok.connect();

とある。

「npm init」して、「npm install ngrok」して、「app.js」新規作成して、
素直にそのまま記載する。

app.js
const ngrok = require('ngrok');
const url = await ngrok.connect();

そして、「node app.js」で実行すると、

/Users/Hitoshi/src/ngrok-nodejs/app.js:2
const url = await ngrok.connect();
            ^^^^^

SyntaxError: await is only valid in async function
    at new Script (vm.js:51:7)
    at createScript (vm.js:136:10)
    at Object.runInThisContext (vm.js:197:10)
    at Module._compile (module.js:613:28)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)
    at Function.Module.runMain (module.js:690:10)
    at startup (bootstrap_node.js:194:16)

・・・っておい。
エラーで実行できねEEEEEEEEEE!!!!!
公式サイトなのに使い方間違ってるううううう
と思ったのは僕だけじゃないはず。

解決方法

以下のように非同期型(async)の関数でラップしてあげればOK!

app.js
const ngrok = require('ngrok');

connectNgrok().then(url => {
    console.log('URL : ' + url);
});

// ngrokを非同期で起動
async function connectNgrok() {
    let url = await ngrok.connect();
    return url;
}

async、await、thenの詳しい使い方は、以下のサイトが参考になりました。
async/await 入門(JavaScript)

実行結果

「node app.js」で実行すると、以下のように出力されます!

URL : https://xxxxxxxx.ngrok.io
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.