Node.js fetch クロスオリジン
【サーバ側】
const cors = require('cors'); //クロスオリジン
1.全部やっちゃっていいとき
app.use(cors());
2.個別に指定するとき
app.get('/getdata', cors(), (req, res) => { });
【ブラウザ側】
fetch('http://123.456.789:3000/getdata, {mode: 'cors'}) .then { });
Node.js app.getで引数を2つ受け取るやつ
★2019-12-19 これもasyncで書き直しました!
(関数をasyncって宣言すると、その関数内ではawaitってキャストした関数が
同期になるよ!ただしpromise返すやつだけ)
【サーバ側】
app.get( '/sql/get_qno/dbname/:dbname/userid/:userid/', async (req, res) => { const dbname = req.params.dbname; //データベース名 const userid = req.params.userid; //ユーザID //SQL文作成 const sql = 'select COALESCE(max("qno"), 0) as maxqno from ' + dbname + ' where "userid" = \'' + userid + '\''; try { const resq = await client.query(sql); res.json(resq.rows); } catch(err) { res.json(["ERROR", err.stack]); } });
【ブラウザ側】
async function getQNo() { try { const res = await fetch('./sql/get_qno/dbname/' + dbName + '/userid/' + userId); const data = await res.json(); QNo = data[0].maxqno; } catch(err) { res.json(["ERROR", err.stack]); } }
Node.js POSTを使ってPostgreSQL にinsertする
★2019-12-19 これもasyncで書き直しました!
(関数をasyncって宣言すると、その関数内ではawaitってキャストした関数が
同期になるよ!ただしpromise返すやつだけ)
【サーバ側】
app.post('/sql/ins_work', async (req, res) => { const sql = 'insert into work(' + 'userid,' + 'qno,' + 'anstime' + ')' + ' values(' + '$1,' + '$2,' + 'to_timestamp($3 / 1000.0)' + ')'; const values = [ req.body.userid, //1 req.body.qno, //2 req.body.anstime //3 time ]; try { const resq = await client.query(sql, values); res.send('OK'); //ACKを返す //(これを送らないと処理が終了したことが送られないので // クライアント側はずっと待ったままになってしまう。 // 返事は大事) } catch(err) { res.send(err.stack); //ACKを返す } });
【ブラウザ側】
async function ins_work() { //json形式でデータセット var data = { userid: 'banjo', qno: 1, anstime: (new Date()).getTime() }; try { const res = await fetch('./sql/ins_work', { method: 'POST', body: JSON.stringify(data), //json文字列に変換してセット headers: { 'Content-Type': 'application/json' //データがjson形式であることを明記 } } const text = await res.text(); if(text == "OK") console.log("[OK]ins_work"); else console.error("[DB ERROR]", text); ) catch(err) { console.error("[fetch ERROR]ins_work", error); } }
Node.js postgreSQL ブラウザでSQL文を入力してデータを取得する
★2019-12-18
asyncを調べたので、fetchの部分をasyncで書き直す
(メモ)XMLHttpRequestの後fetchが流行ったがfetchはpromiseで値を返して
くるとか。
promiseは同期処理を実現するものらしいが、
thenの中をその関数から帰って来た時に実行することを約束して、
処理はそこで止まることなく、次の行へと進む
なので例えばファイル全部読み込むまでそこで止まってて欲しいとき
なんかには使えない
それを実現できるのがasyncとawait
関数をasync宣言しておくと、その中でawaitが使えるようになる
で、非同期でするする返ってきてしまうやつをawaitで返事が返って
くるまで止めておくことができる
・・・・と、いうことのようです。間違ってたらごめん
そうそう!こういう風に書きたかってん!感、満載。
【サーバ側】
const express = require('express'); //expressモジュールを読み込む const app = express(); //expressアプリを生成する //appでjson送る時はこの2つが必要 //※前はbody_parserってやつをinstallする必要があったが今はexpress標準搭載らしい app.use(express.json()); app.use(express.urlencoded({ extended: true })); //-------------------------------------------------------- // データベース接続 //-------------------------------------------------------- const {Client} = require('pg'); //pgモジュールを読み込む const client = new Client( { user: 'postgres', host: '127.0.0.1', database: 'test', password: '', port: 5432, }); client.connect(); //データベースに接続する //-------------------------------------------------------- // select文を受けて結果を返す // ※この部分のURLは自分で決める。決まったものがあるわけではない。 // ブラウザで「localhost:3000/sql/select/sql文」と叩いたらこれが実行される仕組み。 //-------------------------------------------------------- app.get('/sql/select/:sql', //:の部分はreq.paramにセットされる async (req, res) => //req はin、resにはoutするデータをセット //これ、なんでいきなり()書くの?ってずっと謎やってんけど、 //無名関数やったんか!とasyncでやっと理解した!(´∀`*) { //これはpromiseという記述方式らしい //queryの実行が終わってからthenの中身が実行される //非同期を順序通りに実行させるために考案された記述方法らしい try { const resq = await client.query(req.params.sql); //データベースにsqlを投げる res.json(resq.rows); //受け取ったデータをoutパラメータにセット } catch(err) //エラーを受け取る { res.json(["ERROR", err.stack]); //受け取ったエラーをoutパラメータにセット } }); //-------------------------------------------------------- // ポート3000でサーバを立てる // ※別に3000でなくてもよい。 // テスト用に3100に変えた同じプログラムを並列して立てたら、 // それぞれ干渉せずに機嫌よく動いてたんで、なんかそんな感じでw //-------------------------------------------------------- app.listen(3000, () => console.log('Listening on port 3000'));
★これはfetch覚えたての時のやつ。promise構文を恐る恐る使っている
client .query(req.params.sql) //データベースにsqlを投げる .then(resq => //データを受け取る { res.json(resq.rows); //受け取ったデータをoutパラメータにセット }) .catch(err => //エラーを受け取る { res.json(["ERROR", err.stack]); //受け取ったエラーをoutパラメータにセット });
【ブラウザ側】
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>SQL発行</title> </head> <body style="font-size:12px;"> SQL(select文に限る) <input type="text" id="id_sql" style="width:100%"> <button onclick="click_exec()">SQL実行</button> </body> <script> async function click_disp() { const sqlstr = id_sql.value; if(sqlstr == "") return; //文が入力されてなかったら終了 //入力されたSQL文をサーバに送り結果を受信する try { const res = await fetch('./sql/select/' + sqlstr); //結果受信 const data = await res.json(); //結果がエラーだった場合 if(data.length == 2 && data[0] == "ERROR") { document.write("[DBERROR] "); document.write(data[1]); //エラーの内容を表示 } //結果が成功だった場合 else { //結果はレコードの配列で送られてくる for(let i = 0; i < data.length; i++) { for(let key in data[i]) document.write(data[i][key] + ","); document.write("<BR>"); } } } catch(err) { document.write("[FETCH ERROR]"); document.write(err); } } </script> </html>
★これはfetch覚えたての時のやつ。promise構文を恐る恐る使っている
//入力されたSQL文をサーバに送り結果を受信する fetch('./sql/select/' + sqlstr) .then ( //結果受信 response => response.json() ) .then ( data => { //結果がエラーだった場合 if(data.length == 2 && data[0] == "ERROR") { document.write(data[1]); //エラーの内容を表示 } //結果が成功だった場合 else { //結果はレコードの配列で送られてくる for(let i = 0; i < data.length; i++) { for(let key in data[i]) document.write(data[i][key] + ","); document.write("<BR>"); } } } );
Node.jsでディレクトリ下のファイル名一覧を取得してファイルに書く
こんな感じでいけた。
dirimage.js
const fs = require('fs'); //ファイルIOモジュールを読み込む const path = require('path'); //path名チェックモジュールを読み込む const dirpath = "./web/images"; //指定のディレクトリ名 const flst = fs.readdirSync(dirpath, {withFileTypes: true}) //同期でファイル読み込み .filter(dirent => dirent.isFile()).map(({name}) => name) //フォルダ除外 .filter(function(file) { return path.extname(file).toLowerCase() === '.jpg'; //拡張子jpgだけ }); fs.writeFileSync("imageList.txt", flst); //一覧をファイルに書き込む
おまけ ファイルを読み込む
const flst2 = fs.readFileSync('imageList.txt', 'utf8'); //ファイルを読み込む
おまけ2 json形式で書き込みたい時。"util" をinstall、requireする必要あり
const util = require('util'); var objlst = [ {dir: "A", fname: "a.txt"},{dir: "B", fname: "b.txt"}];//←こんなやつ fs.writeFileSync("imageList.js", 'var imageList = ' + util.inspect(objlst, {maxArrayLength: null}) , 'utf-8' ); // {maxArrayLength: null} がなかったら100個以上の時、 //「more items」てなって全部書き込んでくれない・3・
インストールしたやつ
>npm install fs >npm install path >npm install util jsonで書き込みたい時はこれも
実行
> node dirimage.js
管理者なのにフォルダが消せない~windows7~
度々同じことで悩んでいるのでメモ。
今回は、node.js で express で作成したフォルダが消せませんでした。
「管理者権限で実行してください」
管理者やっちゅーねーーーーん!!ヽ(`Д´)ノプンプン
Windows7で管理者(administrator)なのに一部のフォルダやファイルがアクセス制限される原因はこれ。
こちら様の方法を試す。なんか前に無事消せたやつがこれと同じ方法やった気が。
目的のフォルダで右クリックしてポップアップするメニューから「プロパティ」をクリック
とりあえずはこの画面で、読み取り専用のチェックボックスのチェックを外して「適用」
ダメーーー!!•́ε•̀٥
気を取り直して本命の操作。
セキュリティのタブに切り替えて、自分のユーザ選んで(上の画像は撮り損ない)、「詳細設定」
「アクセス許可の変更」
「子オブジェクトのなんちゃらかーちゃら」にチェックを入れて、「適用」
「はい!!」(いいお返事)
で、処理が終了したので、削除を試す!・・・「管理者権限でやってください」
工エエェェ(´д`)ェェエエ工
プロパティを確認したら、すべて元に戻っていました。なんやねん、もー!ヽ(`Д´)ノプンプン
しばらく考えたんだけど、シンプルに、
piyoの下を全部選択して、削除したら、全部削除できて、
それからpiyoフォルダを削除したら。全部削除できました!!(`・ω・´)ゞ
もしかしたら、最初からこの当たり前な方法でサクッと消えたのかもです。(・・???
VisualStudioCode インストール
eclipseでのNode.jsのデバッグの使い方がわかりづらく手こずりまくって、時間がなくなってきてしまったので、諦めてVisualStudioCodeを使ってみることにする。
ダウンロードしてインストール開始。
VSCodeUserSetup-x64-1.38.1.exe
全部デフォルトのまま次へ次へで完了!!
しかし、VSCodeは英語であった。。。日本語にしなければ。
VSCodeを起動。
一番上のメニュー欄の「view」をクリック → メニュー一覧から「comman palette」を選ぶ
コマンドパレットのメニュー一覧から「configure display language」を選ぶ
表示されるメニュー一覧から「install additional languages...」 を選ぶ
表示される言語メニューの中から「日本語」を選んでインストール
完了!
再起動すると日本語になっていました!^^