Node.js関連のことを調べてみた2022年08月31日

Node.js関連のことを調べてみた2022年08月31日

テーブル結合時にSequelizeのfindOneメソッドが発行するSQL(リレーションシップ・Where句ごと)

# 初めに
SequelizeのfindOneメソッドを使用してテーブル結合を行った場合に、リレーションシップやWHERE句の有無などによって生成されるSQLが異なる。
どういった場合にどのようなSQLが生成されるか備忘録として投稿する。

### 基本的なテーブル設計
– Parents(親テーブル)
– id (PRIMARY KEY)
– Children
– id(PRIMARY KEY)
– parent_id(FOREIGN KEY)

※テーブルのカラムは臨機応変に変更するが、基本的には上記のテーブル設計で行う。

## 環境
■ MySQLバージョン
5.7.35
■ Sequelizeバージョン
3.30.4

# 1対多

### Sequelizeのリレーションシップ
“`js
Parents.hasMany(models.Children, {
foreignKey: ‘parent_id’
});
Children.belongsTo(models.Parents, {
foreignKey: ‘parent_id’

元記事を表示

JavaScript/Node.jsでのバイナリデータ処理

## 概要

JavaScriptでバイナリデータを扱おうとすると`Buffer`と`ArraryBuffer`という似た名前のオブジェクトが登場して混乱したり、`Uint8Array`という耳慣れないオブジェクトが登場して途方に暮れたりすることがあると思います。本記事ではこれらのオブジェクトの概念を整理することでJavaScriptでのバイナリデータの扱いの見通しを良くしていきます。

## 概念の整理

まずバイナリデータを処理しようとしている環境がNode.jsなのかブラウザ環境なのかが重要です。Node.js環境の場合は`Buffer`クラスを利用することになります。`Buffer`クラスはNode.jsの標準ライブラリとして実装されています。

https://nodejs.org/api/buffer.html

ブラウザ環境ではJavaScript自体に実装されている`ArraryBuffer`オブジェクトを利用することになります。`Buffer`は実装されていません。

https://developer.mozilla.org/en-US/docs/Web/JavaS

元記事を表示

【Node.js / ブラウザ】JavaScriptでUTF-8のエンコード・デコード

UTF-8のバイト列とJavaScriptの文字列型との間の変換方法。ブラウザでもNode.jsでも共通のコードで動く。

ググっても古いやり方が出てくることが多いので書く。

# エンコード

“`js
function encodeUTF8(str) {
const encoder = new TextEncoder();
return encoder.encode(str);
}

// 使い方例
const bytes = encodeUTF8(‘アイウ’);
// Uint8Array(9) [227, 130, 162, 227, 130, 164, 227, 130, 166]
“`

戻り値は[`Uint8Array`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array)。

# デコード
“`js
function decodeUTF8(buffer) {
const decoder = new TextDecoder();

元記事を表示

Promiseを効率的に処理していく方法

# promise-pool

## やりたいこと

あるAPIを叩いて、データを取ってきたい。20個くらいAPIを叩く先があるけれども、10個ずつ取りにいって、1つの処理が終われば次のAPIを叩きたい。

## 1つずつ取ってくる場合(async await)

“`TypeScript
import axios from ‘axios’;
const first = async () => {
const start = performance.now();
const result1 = await axios.get(‘https://yahoo.co.jp’);
const result2 = await axios.get(‘https://yahoo.co.jp’);
const result3 = await axios.get(‘https://yahoo.co.jp’);
const result4 = await axios.get(‘https://yahoo.co.jp’);
const result5 = await axios.get(‘ht

元記事を表示

NotionのAPIにNode.jsからアクセスしてみるメモ #Notion

Notionを最近触っていますが、APIおよびJavaScript SDKがある模様なので触ってみました。

## インテグレーションを作成する

> https://www.notion.so/my-integrations
> ![スクリーンショット 2022-08-29 17.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/232cd59d-c2af-8fa9-cf1d-8dafebbf2825.png “スクリーンショット 2022-08-29 17.55.05.png”)

名前などを適当に入れて進めてみます。試しに、`Node.jsテスト`としておきました。

> ![スクリーンショット 2022-08-29 17.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/30d8fa3c-5bfb-d30f-4cfc-aac654002fc7.png “スクリーンショット

元記事を表示

Node.js Shift-JISに変換する方法

Node.jsで簡単に文字列をShift_JISに変換する方法を明記します。

環境: Mac OSX

利用するライブラリ [iconv-lite](https://www.npmjs.com/package/iconv-lite)
まずはライブラリのインストールをします。

“`qiita:ターミナル
$npm install –save iconv-lite
“`

“`convert.ts
import {convert} from ‘iconv-lite’;

const str = ‘変換したい文字列’;
const encoded = encode(str, ‘SJIS’); //文字列をShift_JISに変換
console.log(encoded);
“`

元記事を表示

npm init vue@latestをしたらesbuildのinstallでエラーが出た

記事作成日: 2022/8/29
### TL;DR
`npm init vue@latest`して`npm install`するとエラーが出た(エラーログは下に有)。
原因はnodeのバージョンが古かった。

#### 実行環境
“`
macOS Monterey (version12.5.1)
node -v:v16.14.2
npm -version:8.5.0
“`

### 詳細

`npm init vue@latest`し`てnpm install`すると、以下のようなエラーが出た。ログを読むと、esbuildの`install.js`で問題が生じている様。
“`
npm ERR! code 1
npm ERR! path /Users/xxx/xxx/xxx/vuetest/vue-project/node_modules/esbuild
npm ERR! command failed
npm ERR! command sh -c node install.js
npm ERR! node:child_process:828
npm ERR! err =

元記事を表示

さくっとnode-fetch+node-html-parserでスクレイピングする

## node-fetchでいいじゃん

もともとSeleniumとかPuppeteerとかPlayWrightで当然ながら合法的な範囲内でスクレイピングをしていました。しかし、golangでスクレイピングのスクリプトを書いたあとに、そもそもfetchでもいけるじゃないか、と気づきました。node-fetchで簡単にスクレイピングができるので記事にしてみました。

## 完成物

“`TypeScript
import fetch from ‘node-fetch’;
import { parse } from ‘node-html-parser’;

const main = async () => {
const url = ‘https://qiita.com/’;
const response = await fetch(url);
const body = await response.text();
const root = await parse(body);
const h2s = root?.querySelectorAll(‘h2’);
h2s.for

元記事を表示

nextTick vs queueMicrotask vs Promise.resolve vs setTimeout

## はじめに

普段の開発でなかなかお目にかかることも使うことも滅多にない `queueMicrotask` について興味を持ったついでに、 `process.nextTick` や `Promise`, `setTimeout` などとの比較をしてみました。

## TL;DR

– 下記の優先度順でキューからタスクが取り出され処理される。
– `nextTick`
– `queueMicrotask`, `Promise.resolve`
– → Microtask
– `setTimeout`
– → Task (a.k.a. Macrotask)
– より具体的には、MicrotaskキューとTaskキューの2つのキューがあり、Microtaskキューが優先的に処理されるようになっている。
– Microtaskキューが空でない限りはTaskキューの中身を実行しない構造となっており、`queueMicrotask`, `Promise.resolve` では Microtaskキューにコールバックを追加し、`s

元記事を表示

AWS lambda nodeをローカルでdocker開発して、イメージデプロイする

https://aws.amazon.com/jp/builders-flash/202103/new-lambda-container-development/?awsf.filter-name=*all

AWS lambdaの開発にSAMを使用していましたが、ローカルでdocker開発して、そのままデプロイできるようになったらしいので手順の確認。

dockerのイメージ生成→AWSのECRリポジトリにPUSH→AWS Lambda にECRからデプロイ。

https://qiita.com/rei-ta/items/e86546130d157561ba8e

Dockerfile
docker-compose.yml
package.json
app.js

Dockerfile

“`
FROM public.ecr.aws/lambda/nodejs:16
COPY app.js package*.json ./
RUN npm install
CMD [ “app.lambdaHandler” ]
“`

ecrイメージでのdockerを作成。public.ec

元記事を表示

JavaScriptで非重複な配列・オブジェクト配列を作るって話

非重複な配列って、たまに必要になりますよね。
しかも、すぐ忘れる。

てなわけで、今回は『プリミティブ配列』と『オブジェクト配列』の場合の2パターンを実装していきます!

:::note warn
プリミティブ配列って言ってみたけど ”数値や文字列の配列” です。
オブジェクト配列って言ってみたけど ”オブジェクトの配列” です。
※意味合ってんのか??
:::

## まずは完成系のコード

“`js:数値や文字列(プリミティブ)の場合
const data = [ 1, 3, 5, 3, 2, 4, 1, 4 ];

// 非重複の配列を生成
const setObject = new Set(data);
const result = [ …setObject ];

// 出力:[ 1, 3, 5, 2, 4 ];
console.log(result)
“`

“`js:オブジェクトの場合
const data = [
{ id: 1, name: ‘キリン’ },
{ id: 2, name: ‘アサヒ’ },
{ id: 1, name: ‘キリン’

元記事を表示

Node.jsをnodebrewを用いて管理する(Mac向け)

## はじめに
ローカルマシンでバージョンの違う複数のプロジェクトを開発することは往々にしてあると思います。
単一バージョンをインストールしていると、毎回インストールとパスを通す作業が発生しますが、
nodebrewの場合はコマンドだけでNode.jsのバージョンの切り替えが可能です。
(最近はDockerを使うのでホストマシン側のNodeに依存することは少ないかもしれませんが。。)

今回はnodebrewのインストールとバージョン変更手順を説明します。

## Homebrewのインストール
ターミナルを開き、以下のコマンドでMacのパッケージ管理ツールのHomebrewをインストールします。
“`
% /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
“`
参考
https://brew.sh/index_ja

## nodebrewのインストール
ターミナルで以下のコマンドを実行します。
“`
% brew install nod

元記事を表示

Electronでデスクトップアプリをサクッと作る(ボタンイベント付き)

Electonは、JavaSriptとHTML、CSSを知っていればアプリを作ることができるフレームワーク。

公式のドキュメントが日本語対応しているところもうれしい。
https://www.electronjs.org/

ビルド時のコマンドにオプションを指定すると、winodwsやMac、Linux用のアプリも作れる。

## 1. インストール
`electron`は、devDependenciesにインストール。
“`console
npm init -y
npm i -D electron
“`

## 2. index.htmlを用意
ルートディレクトに`index.html`を作成。
アプリを実行したときのトップページになる。
“`html:index.html




SlackからDiscordへメッセージを移行させるDiscord botを作った

### 2022/08/29追記

dicordに送信できる最大文字数 < slackに送信できる最大文字数 みたいなので、slack側の文字数が多い場合には分割して送るようにしました。 --- 先月に↓の記事を投稿したのですが、 https://qiita.com/yuki-n/items/25e73490d82a0ad3c3fd 我ながら使いづらいなと思ったのと、思ったよりも使っている人がいて、わかりずらそうだったので、なんかもっとイケてる感じにしたいなと思いました。 で、「これ最初からdiscord側のbotにしちゃえばいいんじゃね?」と思い立ち、そうすることにしました。 botは以下からサーバーに追加することができます。 https://discord.com/api/oauth2/authorize?client_id=1012738353231302667&permissions=2048&scope=bot ## 雑な使い方 例のごとく雑に使い方を書いておきます。 ### slackのデータをエクスポートする 以下を参考に、エクスポートします。 h

元記事を表示

OTP(One-Time-Password)発行管理アプリを作った

OTP(One-Time-Password)を自分で発行管理できるようにします。
パスワード自体はサーバ側に保管し、OTPのコード生成もサーバ側で実施するようにします。

実は、OTPからコードの生成は、有志のnpmモジュールのお陰で、容易に実装できました。
一方で、OTPのQRコードをPCやスマホに取り込んだり、Windowsでのコピー&ペーストを活用しようとするといろいろ対応しないといけなかったです。

ということで、一応OTPの説明ですが、どちらかというと後者の取り込み方法の方が中身が濃い投稿となりました。。。

# OTPのフォーマット

OTPを初めて生成すると、だいたいQRコードが表示されて、Google Authenticatorなどに取り込むことがほとんどだと思います。
そのQRコードの中身は以下のような形です。

“`otpauth://[メソッド]/[アカウント名]?secret=[シークレット]&issuer=[発行者名]・・・“`

以下例です。

“`otpauth://totp/hogehoge?secret=ABCDEFGHIJK&issuer=%E

元記事を表示

【Node】CloudFunctionsでincrement/decrementしたい

# はじめに
Firebase CloudFunctionsでフィールド値をインクリメントしようとしてちょいハマりかけたので備忘録

# 更新履歴
2022.8.27 初回投稿

# 環境
– macOS Monterey 12.5.1
– Node:v18.7.0
– npm:v8.18.0

# 参考にしたサイト
https://cloud.google.com/firestore/docs/samples/firestore-data-set-numeric-increment?hl=ja

https://www.codegrepper.com/code-examples/typescript/firestore.FieldValue.increment%281%29

https://stackoverflow.com/questions/51016210/increment-counter-with-cloud-functions-for-firebase

# やりたいこと
– Cloud FunctionsのFirestoreの特定のフィールドでincrement/

元記事を表示

Amazon Cloudsearch をlocalのDocker Lamda node.jsから叩く

資料がなかったので、備忘録代わりに。
client-cloudsearch-domain、ローカルなので認証のためにcredentialが必要。endpointだけじゃなくて、regionも必要でした。cloudに持っていくと、認証は別方式のほうが良いと思われるので、消してください。

参考(AWS公式、node用のサンプルがあります)
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-cloudsearch-domain/index.html

docker-compose.yml
Dockerfile
package.json
app.js (実行ファイルなので、任意にindex.jsなどに)

docker-compose.yml

“`
version: ‘3’
services:
cloudsearch-api:
image: cloudsearch-api
build: .
ports:
– 9199:8080
tty: true

元記事を表示

【超簡単】Next.jsアプリ(やその他Node.jsアプリ)をAmazon Lightsailでホスティング

vercelだと簡単にホスティングできるが、DBを持っておらず外部のDBに繋ぐとクソ重いので、LightsailでホスティングもDBも持つ
[Bitnami](https://bitnami.com/)が導入されているため、ほぼ何も導入しなくてもサイトの公開が可能
性能面を考えるとこの方法が一番楽

# この記事で出来ること
Next.jsで作られたHTTPSサイトのホスティング

# Lightsailで構築するメリット
– 他のnodeアプリでも応用可能(ポート3000で起動しているアプリならなんでも可)
– 10分くらいでできる
– DNSもDBもウェブサービスに必要なサービスがこれ一本で完了する
– Firewallなども含め必要な設定が最初から全部完了している

# 作業内容
[Aamazon Lightsail](https://aws.amazon.com/jp/lightsail/)でnode.jsインスタンスを起動
STATIC IP ADDRESSを取得、アタッチ

DNSを設定する

インスタンスにsshでログイン

アプリをgitからclone

apacheが

元記事を表示

WebRTC + Socket.ioについてSTUNサーバとの接続で701エラー

備忘録です。

Node.js
Socket.io
Angular

webRTCを使って、
STUNサーバを使ってNAT越えを試みるも
701エラー

原因は、
マイク・カメラを使うために、サイトをhttps対応させたのに対し、
socket.ioでの通信をhttps対応させていないことでした。

下記参考
https://qiita.com/MahoTakara/items/71977be2d18405fe7339
https://socket.io/docs/v3/server-initialization/
https://qiita.com/jinnai73/items/638dcc1434d47b12e6ba

socket.ioをhttps通信に切り替えて、通信成功
なお、CORS対応がhttpのままでエラーを吐いたりしたので、
そこの修正もお忘れなく。
またクライアント側から接続を試みるURLも当然httpsに変更になります。

資料には、ApacheをSSL対応する資料も。

雑ですが、以上です。

元記事を表示

特定のUSBデバイスを鍵にして、プログラムと連携させる

USBデバイスにはそれぞれ固有のIDが割り振られています。
特定のUSBデバイスが挿入されたときに、プログラムで処理をしたいときに使えるNode.jsのライブラリを公開しました。

https://github.com/TakutoYoshikai/usbkey

## 使い方
### インストール
以下の二つのコマンドを実行する。
“`bash
npm install -g TakutoYoshikai/usbkey

# ローカルのnode_modulesにもインストール
cd /path/to/project
npm install –save TakutoYoshikai/usbkey
“`

### USBデバイスの登録
このコマンドを実行した後、USBデバイスを挿入する。
“`bash
usbkey-register
“`
`./usbkey`というファイルが生成されます。これが登録されたUSBメモリを検知する、ハッシュ化されたパスワードのようなものです。

以下のJavaScriptファイルを用意し、好きな処理を追加する。

“`javascript:inde

元記事を表示

OTHERカテゴリの最新記事