だら$ちっぷす

仕事の覚書です

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)なのに一部のフォルダやファイルがアクセス制限される原因はこれ。

 

こちら様の方法を試す。なんか前に無事消せたやつがこれと同じ方法やった気が。

 

目的のフォルダで右クリックしてポップアップするメニューから「プロパティ」をクリック

f:id:daralib:20191001161150j:plain

とりあえずはこの画面で、読み取り専用のチェックボックスのチェックを外して「適用」

 

      ダメーーー!!•́ε•̀٥

 

気を取り直して本命の操作。

f:id:daralib:20191001161420j:plain

セキュリティのタブに切り替えて、自分のユーザ選んで(上の画像は撮り損ない)、「詳細設定」

 

f:id:daralib:20191001161743j:plain

「アクセス許可の変更」

 

f:id:daralib:20191001161920j:plain

「子オブジェクトのなんちゃらかーちゃら」にチェックを入れて、「適用」

 

f:id:daralib:20191001162221j:plain

「はい!!」(いいお返事)

 

で、処理が終了したので、削除を試す!・・・「管理者権限でやってください」

 

        工エエェェ(´д`)ェェエエ工

 

プロパティを確認したら、すべて元に戻っていました。なんやねん、もー!ヽ(`Д´)ノプンプン

 

しばらく考えたんだけど、シンプルに、

piyoの下を全部選択して、削除したら、全部削除できて、

それからpiyoフォルダを削除したら。全部削除できました!!(`・ω・´)ゞ

もしかしたら、最初からこの当たり前な方法でサクッと消えたのかもです。(・・???

 

 

 

 

 

 

 

 

 

 

 

 

 

VisualStudioCode インストール

eclipseでのNode.jsのデバッグの使い方がわかりづらく手こずりまくって、時間がなくなってきてしまったので、諦めてVisualStudioCodeを使ってみることにする。

 

azure.microsoft.com

 

ダウンロードしてインストール開始。

 

f:id:daralib:20191205150151j:plain

 

f:id:daralib:20191205150917j:plain

 

VSCodeUserSetup-x64-1.38.1.exe

 

f:id:daralib:20191205151006j:plain

f:id:daralib:20191205151021j:plain

 

f:id:daralib:20191205151108j:plain

 

f:id:daralib:20191205151139j:plain

f:id:daralib:20191205151156j:plain

f:id:daralib:20191205151221j:plain

f:id:daralib:20191205151255j:plain

 

全部デフォルトのまま次へ次へで完了!!

しかし、VSCodeは英語であった。。。日本語にしなければ。

 

VSCodeを起動。

一番上のメニュー欄の「view」をクリック → メニュー一覧から「comman palette」を選ぶ

 

f:id:daralib:20191205151422j:plain

 

コマンドパレットのメニュー一覧から「configure display language」を選ぶ

f:id:daralib:20191205151432j:plain

 

表示されるメニュー一覧から「install additional languages...」 を選ぶ

f:id:daralib:20191205151441j:plain

 

表示される言語メニューの中から「日本語」を選んでインストール

f:id:daralib:20191205151803j:plain

 

完了!

f:id:daralib:20191205151925j:plain

 

再起動すると日本語になっていました!^^

f:id:daralib:20191205152003j:plain

 

nodeclipseを入れる

※入れたけど、すでにあるプログラムを読み込ませる方法がわからなくて時間が押してきたので、visual studio codeに浮気して、結局使ってないですー。でも、インストールに成功したのが嬉しかったので書く。eclipse、めっちゃ進化しててびっくりした!

 

 

node.jsでプログラムを作るにあたってデバッグ環境が欲しいなーと思う。eclipseやったらなんか追加でできるんちゃうん?と思いググるとnodeclipseなるものがあると知る。入れてみる。

 

1.pleiadesをインストール

 

    Eclipse 日本語化 | MergeDoc Project

 

    2019-06が最新だったので、それのUltimateを入れた。

    以前、最後に入れたのがLunaだったので、ものすごく変わっててびっくりした!!!!

 

    eclipseのインストールは、落としてきた圧縮ファイルを解凍して適当な位置に置くだけ。

    そのフォルダまるごとがeclipseで、他のフォルダとかレジストリとか使われていないので、

    てっぺんのフォルダ名を違うものにしておけば複数のeclipseを1つのマシンに入れることもできる。

 

    ダウンロードしてきたeclipseの圧縮ファイルは windows標準の解凍ツールだとエラーになるので注意。

    長い名前が含まれているので、解凍できない。(めっちゃ苦労した!!><、)

    今回は7zipを落としてきて、解凍しました。

 

    圧縮・解凍ソフト 7-Zip

 

 

2.念の為、eclipse.exe -clean.cmdでpleiadesを立ち上げる

 

3.ヘルプ→Eclipseマーケットプレースを開く 

    ここで、最初、「新規ソフトウェアのインストール」でやって、どつぼにハマった。><

    マーケットプレースってのを見つけたので、eclipseのルートからまるごと削除してリベンジです!

    Lunaのときにはマーケットプレースってなかったよねえ?いつから登場したんですかね?

 

     f:id:daralib:20191011134342p:plain

 

4.マーケットプレースのSearchタグの一覧からNode.jsを見つけて「インストール」ボタンを押す

 

  f:id:daralib:20191011134736j:plain

 

5.パースペクティブの一覧をみると「ノード」が追加されてるので、「開く」を押す

 

       f:id:daralib:20191011135001j:plain

 

6.「ノード」ができてる!!

     つか、何が感動かというと、もちろんnodeができてるのは感動なんですけど、

     予めeclipsePHPやらPythonが入ってることですよー。

     Lunaの頃は四苦八苦しながらそれらを入れた覚えがあるので・・・^^;

 

     f:id:daralib:20191011135323j:plain

 

 

7.プロジェクトを作ってみる

    この辺から、もう、ぐちゃぐちゃ^^;

    よくわかってなくて、まとめようがないので、やってみたことをメモってるだけです。

 

  ・Node.js Project で作成してみる   

    f:id:daralib:20191011141422j:plain

 

  ・Node.js Express Project で作成してみる

    f:id:daralib:20191011141458j:plain

 

  ・いろいろ作成してみた結果

 

f:id:daralib:20191011142027j:plain 

 express1: Node.js Express Project / Jade

 で作ったやつ

   nodejs1: Node.js Projet / none/Empty

 で作ったやつ

   nodejs2: Node.js Project / Hello World

 で作ったやつ

 

 

 nodejs3: Node.js Project / hello-html

 で作ったやつ

 

    

 

 

        

 

 

 

 

 

 

 

8.プロジェクトを実行してみる

    なんかよくわからないけど、nodejs2だけ実行できたよ!

    時間切れなので、nodeclipseの追求はここで一旦終了します。

 

f:id:daralib:20191011143813j:plain

 

 

    f:id:daralib:20191011145718j:plain  

    f:id:daralib:20191011145748j:plain