node.jsでの同期処理

node.jsで同期処理を何度も忘れて、何度も調べなおしてしまうので、コードを貼り付け。


// npm install mongodb
// npm install sqlite3

run();

async function run() {
console.log('run 100');
var str = await sleep(1000, 'with await');
console.log(str); // await をつけると同期

console.log('run 200');
var str = sleep(1000, 'without await');
console.log(str); // await をつけないと非同期

console.log('run 300');
requireJSON(); // require はそもそも同期

console.log('run 400');
await readFileJSON(); // fs.readFile では同期指定が必要

console.log('run 500');
readFileSyncJSON(); // fs.readFileSync はそもそも同期

console.log('run 600');
await child_process_whoami(); // 子プロセス

console.log('run 700');
await child_process_sakasa_exe(); // 返り値を受け取る

console.log('run 800');
await child_process_ffmpeg_exe(); // 画像生成

console.log('run 900');
await mongodb(); // mongodb への接続

console.log('run 1000');
var list = await sqlite3(); // sqlite3 への接続
console.dir(list);

console.log('run 1100');
}

function sleep(ms, msg) {
return new Promise(resolve => {
setTimeout(() => {
console.log('sleep', ms, msg);
resolve('comp setTimeout');
}, ms);
})
}

function requireJSON() {
var json = require('./data.json');
console.log(json);
}

function readFileJSON() {
return new Promise((resolve, reject) => {
var fs = require('fs');
var path = "data.json";
fs.readFile(path, 'utf8', (err, data) => {
console.log(data);
resolve();
});
});
}

function readFileSyncJSON() {
var fs = require('fs');
var path = "data.json";
var str = fs.readFileSync(path, 'utf8');
console.log(str);
}

function child_process_whoami() {
return new Promise((resolve) => {
require('child_process').exec('whoami', (err, stdout, stderr) => {
console.log('stdout:', stdout);
resolve(stdout);
});
});
}

function child_process_sakasa_exe() {
return new Promise((resolve) => {
require('child_process').exec('sakasa.exe "Mizutama Inc."', (err, stdout, stderr) => {
console.log('stdout:', stdout);
resolve(stdout);
});
});
}

function child_process_ffmpeg_exe() {
var source = 'pcloud640480.exe';
var AppPath = 'C:\\inetpub\\ffmpeg-20180820-78d4b6b-win64-static\\bin\\ffmpeg.exe';
var source = 'pcloud640480.mp4';
var out = source + '_ex_ffmpeg.exe.jpg';
var argument = ' -y -i "' + source + '" -f image2 -vframes 1 -ss 3 -an -deinterlace "' + out + '"';
var cmd = AppPath + ' ' + argument;
return new Promise((resolve, reject) => {
require('child_process').exec(cmd, (err, stdout, stderr) => {
console.log('err:', err);
console.log('stdout:', stdout);
console.log('stderr:', stderr);
//console.log(out);
resolve();
});
});
}

function mongodb() {
var url = 'mongodb://127.0.0.1:27017/';
var collectionName = 'startup_log';
var mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
return new Promise((resolve) => {
MongoClient.connect(url, {
useNewUrlParser: true
}, (err, client) => {
const db = client.db('local');
var collection = db.collection(collectionName);
collection.find().toArray((error, documents) => {
console.log(documents);
resolve(documents);
});

});
});
}

function sqlite3() {
return new Promise((resolve, reject) => {
var sqlite = require('sqlite3').verbose();
var db = new sqlite.Database('test.sqlite');

console.log('sqlite3 100');
db.serialize(() => {
db.run('CREATE TABLE IF NOT EXISTS pigs(name TEXT, age INT)');
var stmt = db.prepare('INSERT INTO pigs VALUES(?,?)');
stmt.run(["boo", 5]);
stmt.run(["foo", 4]);
stmt.run(["woo", 3]);
stmt.finalize();
console.log('sqlite3 200');
});
console.log('sqlite3 300');

db.serialize(() => {
var list = [];
db.each("SELECT * FROM pigs", (err, row) => {
list.push(row.name + ":" + row.age);
console.log(row.name + ":" + row.age);
console.log('sqlite3 400');
},
(err, count) => {
console.log('sqlite3 comp' + count);
resolve(list);
});
console.log('sqlite3 500');

});
console.log('sqlite3 600');
db.close();
console.log('sqlite3 700');
});
}

以下、Windows PowerShellでのコマンド結果

> node test.js
run 100
sleep 1000 with await
comp setTimeout
run 200
Promise { }
run 300
[ { group: 'pigs', name: [ 'boo', 'foo', 'woo' ] } ]
run 400
[
{ "group" : "pigs", "name" : ["boo","foo","woo"]}
]
run 500
[
{ "group" : "pigs", "name" : ["boo","foo","woo"]}
]
run 600
stdout: umeha\umeha

run 700
stdout: CGI page.cnI amatuziM

run 800
err: null
stdout:
stderr: ffmpeg version N-91646-g78d4b6bd43 Copyright (c) 2000-2018 the FFmpeg developers
~省略(ffmpegの返り値)~
erhead: unknown

run 900
[
{
~省略(mongodbで取得したデータ)~
}
]
run 1000
sqlite3 100
sqlite3 200
sqlite3 300
sqlite3 500
sqlite3 600
sqlite3 700
boo:5
sqlite3 400
foo:4
sqlite3 400
woo:3
sqlite3 400
sqlite3 comp3
[ 'boo:5', 'foo:4', 'woo:3' ]
run 1100
sleep 1000 without await

参考
Node.jsのMongoClientの仕様が変わってた
MongoClient.connect()時にuseNewUrlParserオプションを与える
node.jsでファイルの読み込み、新規作成、上書き、追記、削除
Node.jsでasyncモジュールを使って同期処理を行う
Node.js + MongoDBを導入する
node.jsでjsonファイルの読み込み
Node.js+express+MongoDB+Mongooseで簡単なjsonサーバを構築するメモ
Node.jsでSQLite3を使ってみる
Node.jsを使った簡単なファイル操作
今更だけどPromise入門

Comments are closed.