dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

Node.js で axios による http リクエスト

2021-11-02 21:39:30 | Node.js
Node.js で axios による http リクエストのメモ。
axios では、レスポンスステータスが 404 などの場合、
例外をキャッチして処理する必要があります。
const axios = require('axios');

async function http_get(url, params) {
  console.log(url);

  try {
    const response = await axios.get(url, params);
    console.log('[success]');
    console.log('[status]', response.status);
    console.log('[data]', response.data.substr(0, 40));
  } catch (e) {
    const response = e.response;
    console.log('[error]');
    console.log('[status]', response.status);
    console.log('[data]', response.data.substr(0, 40));
  }
}

(async () => {
  const params = {
    MT: '検索',
    IE: 'UTF-8',
    OE: 'UTF-8',
  };

  // 200 OK                                                                     
  await http_get('https://search.goo.ne.jp/web.jsp', params);

  // 404 not found                                                              
  await http_get('https://search.goo.ne.jp/dummy.jsp', params);
})();

実行結果
https://search.goo.ne.jp/web.jsp
[success]
[status] 200
[data] <!DOCTYPE HTML> <html lang="ja" class="seatchTopHtml"> <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"> <meta charset="UTF-8"/> <meta name="referrer" content="origin-when-cross-origin"> 
https://search.goo.ne.jp/dummy.jsp
[error]
[status] 404
[data] <!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex,follow">
<title>404 - gooウェブ検索</title>
<meta name="viewport" content="width=device-width,initial-sca




node.js での json オブジェクトの比較

2021-10-27 00:26:13 | Node.js
node.js で json オブジェクトを比較する方法のメモ

2つの json オブジェクトが一致しているかを比較するために、以下の compare メソッドを作成しました。
module.exports = class JsonUtil {
  static compare(obj1, obj2) {
    if (obj1 instanceof(Array)) {
      if (! (obj2 instanceof(Array))) return false;
      if (obj1.length != obj2.length) return false;
      for (let i = 0; i < obj1.length; i++) {
        const res = JsonUtil.compare(obj1[i], obj2[i]);
        if (! res) return false;
      }
    }
    else if (obj1 instanceof(Object)) {
      if (obj2 instanceof(Array) || ! (obj2 instanceof(Object))) return false;
      if (Object.keys(obj1).length != Object.keys(obj2).length) return false;
      for (let [key, val1] of Object.entries(obj1)) {
        const val2 = obj2[key];
        const res = JsonUtil.compare(val1, val2);
        if (! res) return false;
      }
    }
    else if (obj1 !== obj2) {
      return false;
    }

    return true;
  }
}

上記の compare メソッドで json の比較を行ってみます。
const JsonUtil = require('JsonUtil');

console.log(JsonUtil.compare('abc', 'abc'));
console.log(JsonUtil.compare([1, 2, 3], [1, 2, 3]));
console.log(JsonUtil.compare({"a": 1, "b": 2}, {"a": 1, "b": 2}));
console.log(JsonUtil.compare({"a": 1, "b": 2}, {"a": "1", "b": "2"}));

実行結果は以下の通り想定通りの結果となりました。
true
true
true
false


Node.js のプログラムの単体テスト

2021-10-10 18:03:09 | Node.js
Node.js のプログラムの単体テストを行う方法のメモ。

nodeunit で node.js のプログラムの単体テストを行うことができます。
nodeunit のインストールは以下で行うことができます。
sudo npm install -g nodeunit

単体テストの対象のプログラムの Test1.js と単体テストのプログラムの test_test1.js を以下のディレクトリ構成で配置します。
.
├── lib
│   └── Test1.js
└── test
    └── test_Test1.js

Test1.js は以下のようなプログラムです。
module.exports = class Test1 {
    constructor (str) {
	this.str = str;
    }

    add(str) {
	this.str += str;
	return this.str;
    }

    add2(str1, str2) {
	this.str += str1 + str2;
	return this.str;
    }
}

単体テストのプログラムは、以下のようなプログラムです。
const Test1 = require('../lib/Test1');

module.exports = {
    'test add': function (test) {
	let obj1 = new Test1('abc');
	test.equal(obj1.add('def'), 'abcdef');

	let obj2 = new Test1('uvw');
	test.equal(obj2.add('xyz'), 'uvwxyz');
	
	test.done();
    },

    'test add2': function (test) {
	let obj1 = new Test1('012');
	test.equal(obj1.add2('345', '678'), '012345678');
	test.done();
    }
};

test.equal() は引数の2つの値が等しいかのアサーションです。
テストケースの最後では test.done() を実行します。
nodeunit での単体テストを行うには、単体テストのプログラムがあるディレクトリを引数に指定して nodeunit を実行します。
$ nodeunit test

test_Test1
? test add
? test add2

OK: 3 assertions (17ms)