Nodeはバージョンアップされるのが早いので、以前に投稿した記事の手順で、ちょくちょく安定版のバージョンに設定している。
そして、今回、Nodeを最新バージョンにして、yarnを実行したら、エラーになった。
$ yarn -v -bash: yarn: command not found
なので、yarnをinstallし直す。
$ npm install --global yarn
yarnのinstall後の確認。これで解決。
$ yarn -v 1.22.17
Nodeはバージョンアップされるのが早いので、以前に投稿した記事の手順で、ちょくちょく安定版のバージョンに設定している。
そして、今回、Nodeを最新バージョンにして、yarnを実行したら、エラーになった。
$ yarn -v -bash: yarn: command not found
なので、yarnをinstallし直す。
$ npm install --global yarn
yarnのinstall後の確認。これで解決。
$ yarn -v 1.22.17
NuxtでBootstapVueを入れて、動かしてみた。
公式のサイトに情報はあるけど、前置きが長いのね。
冒頭にインストール方法とサンプルコードがあるのが個人的にはうれしいのだけどね。
https://bootstrap-vue.org/docs
ということで、後で再度同じことを行うときに、長い前置きを読まなくてよくするために備忘録を残しておく。
まず、BootstrapVueの設定。(yarnを使っている。BootstrapVueを追加する。)
yarn add bootstrap-vue
そんで、サンプルコード。
index.vueにコーディングする。(こちらのサイトの内容そのまま https://bootstrap-vue.org/docs/components/table)
これで、動きましたよ、と。
<template>
<div>
<b-table :items="items" hover="" striped=""></b-table>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
{ age: 21, first_name: 'Larsen', last_name: 'Shaw' },
{ age: 89, first_name: 'Geneva', last_name: 'Wilson' },
{ age: 38, first_name: 'Jami', last_name: 'Carney' }
]
}
}
}
</script>
プライベートでNuxtを使ったプログラミングしてて、Nuxtのバージョンを確認すると、Node.jsが古いので新しいものを使った方がいいよと、メッセージが表示された。
npx nuxt -v WARN You are using an unsupported version of Node.js (v10.20.1). It is recommended to use the latest LTS version (https://nodejs.org/en/about/releases) 10:03:02 @nuxt/cli v2.15.1
まず、上記コマンド実行後のメッセージのサイトの内容を確認してみる。
https://nodejs.org/en/about/releases
Major Node.js versions enter Current release status for six months, which gives library authors time to add support for them. After six months, odd-numbered releases (9, 11, etc.) become unsupported, and even-numbered releases (10, 12, etc.) move to Active LTS status and are ready for general use. LTS release status is "long-term support", which typically guarantees that critical bugs will be fixed for a total of 30 months. Production applications should only use Active LTS or Maintenance LTS releases.
ActiveLTS 、 MaintenanceLTS のどちらかを使った方がいいみたいだ。
今は、自分の環境はv10で、最新のv10にすれば大丈夫だけど、後先短いのでv14に切り替えることにする。
そういえば、Node.jsは長い間、バージョン切り替えてなかった記憶なので、切替方法を探ってみる。
というか、過去に自分のブログで、同内容の記事を書いていたのを忘れてた。
まぁ、これは、Nodebrewのインストールの内容もあるのだけれども。
ということで、この記事を参考にNode.jsのバージョンを切り替える。
現在のインストールされているNode.jsのバージョンを確認する。
nodebrew ls v10.10.0 v10.20.1 v14.1.0
既に、v14はあったのね。
でも、リビジョンが古いので、最新版を入手しよう。
nodebrew install stable Fetching: https://nodejs.org/dist/v14.15.5/node-v14.15.5-darwin-x64.tar.gz ################################################################################################################################################################ 100.0% Installed successfully
インストールできたので、v14に切り替える。
nodebrew use v14.15.5 use v14.15.5
v14に切り替わったか確認する。
node -v v14.15.5
<!DOCTYPE html>
<html>
<head>
<script crossorigin="" src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin="" src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
<script crossorigin="" src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div id="root">
</div>
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
)
</script>
</body>
</html>
git clone git@github.com:takaharu-kobayashi/multer_sample.git Cloning into 'multer_sample'... Enter passphrase for key '/Users/[XXXXX]/.ssh/id_rsa': remote: Enumerating objects: 4, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (3/3), done. remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (4/4), done.
cd ./multer_sample/ git status On branch master Your branch is up to date with 'origin/master'. Untracked files: (use "git add..." to include in what will be committed) app.js bin/ package.json public/ routes/ views/ nothing added to commit but untracked files present (use "git add" to track)
git add . git status On branch master Your branch is up to date with 'origin/master'. Changes to be committed: (use "git reset HEAD..." to unstage) new file: app.js new file: bin/www new file: package.json new file: public/javascripts/jquery-2.1.4.min.js new file: public/uploads/dummy.txt new file: routes/index.js new file: views/error.ect new file: views/footer.ect new file: views/index.ect new file: views/layout.ect new file: views/script.ect
git commit -m "Added multer sample files" [master f20cf5d] Added multer sample files 11 files changed, 296 insertions(+) create mode 100644 app.js create mode 100755 bin/www create mode 100644 package.json create mode 100644 public/javascripts/jquery-2.1.4.min.js create mode 100644 public/uploads/dummy.txt create mode 100644 routes/index.js create mode 100644 views/error.ect create mode 100644 views/footer.ect create mode 100644 views/index.ect create mode 100644 views/layout.ect create mode 100644 views/script.ect
git push Enter passphrase for key '/Users/[XXXXX]/.ssh/id_rsa': Counting objects: 19, done. Delta compression using up to 4 threads. Compressing objects: 100% (14/14), done. Writing objects: 100% (19/19), 32.59 KiB | 5.43 MiB/s, done. Total 19 (delta 0), reused 0 (delta 0) To github.com:takaharu-kobayashi/multer_sample.git 80e8133..f20cf5d master -> master
git clone git@github.com:takaharu-kobayashi/multer_sample.git Cloning into 'multer_sample'... Enter passphrase for key '/Users/[XXXXX]/.ssh/id_rsa': remote: Enumerating objects: 23, done. remote: Counting objects: 100% (23/23), done. remote: Compressing objects: 100% (17/17), done. remote: Total 23 (delta 1), reused 19 (delta 0), pack-reused 0 Receiving objects: 100% (23/23), 33.63 KiB | 242.00 KiB/s, done. Resolving deltas: 100% (1/1), done.
cd ./multer_sample/ npm install npm WARN deprecated jade@1.11.0: Jade has been renamed to pug, please install the latest version of pug instead of jade npm WARN deprecated constantinople@3.0.2: Please update to at least constantinople 3.1.1 npm WARN deprecated transformers@2.1.0: Deprecated, use jstransformer npm WARN deprecated coffee-script@1.12.7: CoffeeScript on NPM has moved to "coffeescript" (no hyphen) npm notice created a lockfile as package-lock.json. You should commit this file. added 136 packages from 155 contributors and audited 212 packages in 3.884s found 15 vulnerabilities (8 low, 2 moderate, 5 high) run `npm audit fix` to fix them, or `npm audit` for details
npm start
var date = new Date();
date.setMonth(month);
date.setMonth(date.getMonth() - 1);
date.setMonth(date.getMonth() + 1);
function dateTest1() {
var date = new Date();
date.setMonth(5);//6月
date.setDate(0);//5月の最終日を設定
console.log("date.getMonth() = " + date.getMonth());
console.log("date.getDate() = " + date.getDate());
var previousM = new Date(date.getTime());
previousM.setMonth(previousM.getMonth() - 1);
console.log("previousM.getMonth() = " + previousM.getMonth());
console.log("previousM.getDate() = " + previousM.getDate());
var nextM = new Date(date.getTime());
nextM.setMonth(nextM.getMonth() + 1);
console.log("nextM.getMonth() = " + nextM.getMonth());
console.log("nextM.getDate() = " + nextM.getDate());
}
date.getMonth() = 4 date.getDate() = 31 previousM.getMonth() = 4 previousM.getDate() = 1 nextM.getMonth() = 6 nextM.getDate() = 1
function dateTest2() {
var date = new Date();
date.setMonth(5);//6月
date.setDate(0);//5月の最終日を設定
console.log("date.getMonth() = " + date.getMonth());
console.log("date.getDate() = " + date.getDate());
var previousM = new Date(date.getTime());
previousM.setDate(0);
console.log("previousM.getMonth() = " + previousM.getMonth());
console.log("previousM.getDate() = " + previousM.getDate());
var nextM = new Date(date.getTime());
nextM.setDate(date.getDate() + 1);
console.log("nextM.getMonth() = " + nextM.getMonth());
console.log("nextM.getDate() = " + nextM.getDate());
}
date.getMonth() = 4 date.getDate() = 31 previousM.getMonth() = 3 previousM.getDate() = 30 nextM.getMonth() = 5 nextM.getDate() = 1
<div class="page-header"> <h1>Buttons</h1> </div> <button class="btn btn-lg btn-default" type="button">Default</button> <button class="btn btn-lg btn-primary" type="button">Primary</button> <button class="btn btn-lg btn-success" type="button">Success</button> <button class="btn btn-lg btn-info" type="button">Info</button> <button class="btn btn-lg btn-warning" type="button">Warning</button> <button class="btn btn-lg btn-danger" type="button">Danger</button> <button class="btn btn-lg btn-link" type="button">Link</button> <button class="btn btn-default" type="button">Default</button> <button class="btn btn-primary" type="button">Primary</button> <button class="btn btn-success" type="button">Success</button> <button class="btn btn-info" type="button">Info</button> <button class="btn btn-warning" type="button">Warning</button> <button class="btn btn-danger" type="button">Danger</button> <button class="btn btn-link" type="button">Link</button> <button class="btn btn-sm btn-default" type="button">Default</button> <button class="btn btn-sm btn-primary" type="button">Primary</button> <button class="btn btn-sm btn-success" type="button">Success</button> <button class="btn btn-sm btn-info" type="button">Info</button> <button class="btn btn-sm btn-warning" type="button">Warning</button> <button class="btn btn-sm btn-danger" type="button">Danger</button> <button class="btn btn-sm btn-link" type="button">Link</button> <button class="btn btn-xs btn-default" type="button">Default</button> <button class="btn btn-xs btn-primary" type="button">Primary</button> <button class="btn btn-xs btn-success" type="button">Success</button> <button class="btn btn-xs btn-info" type="button">Info</button> <button class="btn btn-xs btn-warning" type="button">Warning</button> <button class="btn btn-xs btn-danger" type="button">Danger</button> <button class="btn btn-xs btn-link" type="button">Link</button>
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// ECT view engine setup
var ECT = require('ect');
var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext: '.ect'});
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ect');
app.engine('ect', ectRenderer.render);
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
<html> <head> <title>Error <%= @error.status %>>/title> </head> <body> <span> Error Status: <%= @error.status %> <hr /> <pre><%= @error.stack %></pre> </span> </body> </html>
<div id="footer"> <div class="left"> Generated by ECT</div> <% content 'footer-info' %> </div>
<% extend 'layout' %> <%= "This is sample" %> <h1> <%= @title %></h1> Welcome to <%= @title %> <div class="page-header"> <h1> Buttons</h1> </div> <button class="btn btn-lg btn-default" type="button">Default</button> <button class="btn btn-lg btn-primary" type="button">Primary</button> <button class="btn btn-lg btn-success" type="button">Success</button> <button class="btn btn-lg btn-info" type="button">Info</button> <button class="btn btn-lg btn-warning" type="button">Warning</button> <button class="btn btn-lg btn-danger" type="button">Danger</button> <button class="btn btn-lg btn-link" type="button">Link</button> <button class="btn btn-default" type="button">Default</button> <button class="btn btn-primary" type="button">Primary</button> <button class="btn btn-success" type="button">Success</button> <button class="btn btn-info" type="button">Info</button> <button class="btn btn-warning" type="button">Warning</button> <button class="btn btn-danger" type="button">Danger</button> <button class="btn btn-link" type="button">Link</button> <button class="btn btn-sm btn-default" type="button">Default</button> <button class="btn btn-sm btn-primary" type="button">Primary</button> <button class="btn btn-sm btn-success" type="button">Success</button> <button class="btn btn-sm btn-info" type="button">Info</button> <button class="btn btn-sm btn-warning" type="button">Warning</button> <button class="btn btn-sm btn-danger" type="button">Danger</button> <button class="btn btn-sm btn-link" type="button">Link</button> <button class="btn btn-xs btn-default" type="button">Default</button> <button class="btn btn-xs btn-primary" type="button">Primary</button> <button class="btn btn-xs btn-success" type="button">Success</button> <button class="btn btn-xs btn-info" type="button">Info</button> <button class="btn btn-xs btn-warning" type="button">Warning</button> <button class="btn btn-xs btn-danger" type="button">Danger</button> <button class="btn btn-xs btn-link" type="button">Link</button> <% block 'footer-info' : %> <div class="right"> page: sample</div> <% end %>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title><%- @title %></title> <link href="css/bootstrap.min.css" rel="stylesheet"> <% include 'script' %> <script src="js/bootstrap.min.js"></script> </head> <body> <% content %> <% include 'footer' %> </body> </html>
<script src="./javascripts/jquery-2.1.4.min.js"></script>
{
"name": "bootstrap",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.13.2",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"express": "~4.13.1",
"jade": "~1.11.0",
"morgan": "~1.6.1",
"serve-favicon": "~2.3.0"
}
}
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var sendreceive = require('./routes/sendreceive');
var app = express();
// ECT view engine setup
var ECT = require('ect');
var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext: '.ect'});
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ect');
app.engine('ect', ectRenderer.render);
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/sendreceive', sendreceive);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
var express = require('express');
var router = express.Router();
/* POST ajax listing. */
router.post('/', function(req, res, next) {
res.send({"send parameter is" : req.body.sendParam});
});
module.exports = router;
<% extend 'layout' %>
<%= "This is sample" %>
<div id="drag-area" style="background-color: lightgrey; text-align: center;">
ajaxボタン送信ボタンを押すと、ajax送信します。<br />
<div class="btn-group">
<button id="btn">ajax送信</button>
</div>
</div>
<form action="/sendreceive" method="post" name="frm">
<input name="sendParam" type="hidden" value="from form" />
>input type="submit" value="form送信" />
</form>
<div id="test">
</div>
<% block 'footer-info' : %>
<div class="right">
page: sample</div>
<script>
$(function(){
$('#btn').click(function() {
sendData();
});
});
function sendData() {
$.ajax({
url: "http://" + location.host + "/sendreceive",
type: "post",
data: {"sendParam": "from ajax"},
success: function(data) {
alert("データが送信されました。 : " + JSON.stringify(data));
}
});
}
</script>
<% end %>
{
"name": "xxx",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.13.2",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"express": "~4.13.1",
"jade": "~1.11.0",
"morgan": "~1.6.1",
"serve-favicon": "~2.3.0",
"node-stringify": "0.0.19"
}
}
abcあ
var fs = require('fs');
app.post('/up', upload.single('upFile'), function (req, res, next) {
var readableStream = fs.createReadStream(req.file['path']);
readableStream.on('readable', function() {
var chunk;
while (null !== (chunk = readableStream.read(8))) {
console.log('chunk[' + chunk + ']');
for (var i = 0; i < chunk.length; i++) {
console.log("chunk[" + i + "] = " + chunk[i] + " : chunk[" + i + "].toString(16) = " + chunk[i].toString(16));
}
}
});
res.render('index');
});
chunk[abcあ ] chunk[0] = 97 : chunk[0].toString(16) = 61 chunk[1] = 98 : chunk[1].toString(16) = 62 chunk[2] = 99 : chunk[2].toString(16) = 63 chunk[3] = 227 : chunk[3].toString(16) = e3 chunk[4] = 129 : chunk[4].toString(16) = 81 chunk[5] = 130 : chunk[5].toString(16) = 82 chunk[6] = 10 : chunk[6].toString(16) = a
var multer = require('multer');
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
var upload = multer({
dest: __dirname + '/public/uploads/'
});
// ECT view engine setup
var ECT = require('ect');
var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext: '.ect'});
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ect');
app.engine('ect', ectRenderer.render);
// routes setup
var routes = require('./routes/index');
app.use('/', routes);
app.post('/up', upload.single('upFile'), function (req, res, next) {
for (var item in req.file) {
console.log(item + ":" + req.file[item]);
}
res.render('index');
});
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index');
});
module.exports = router;
<% extend 'layout' %>
<div id="drag-area" style="background-color: lightgrey; text-align: center;">
アップロードするファイルをドロップ<br />
または<br />
<div class="btn-group">
<input name="upFile" style="display: none;" type="file" />
<button id="btn">ファイルを選択</button>
</div>
</div>
<% block 'footer-info' : %>
<div class="right">
page: upload</div>
<script>
$(function(){
$('#drag-area').bind('drop', function(e){
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
upload(files);
}).bind('dragenter', function(){
return false;
}).bind('dragover', function(){
return false;
});
$('#btn').click(function() {
$('input[type="file"]').click();
});
$('input[type="file"]').change(function(){
var files = this.files;
upload(files);
});
});
function upload(files) {
if (files == null || files.length == 0) {
return;
}
var frm = new FormData();
frm.append("upFile", files[0]);
$.ajax({
url: 'http://' + location.host + '/up',
type: 'post',
data: frm,
processData: false,
contentType: false,
success: function(data) {
alert('ファイルがアップロードされました。');
}
});
}
</script>
<% end %>
{
"name": "upload",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.13.2",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"express": "~4.13.1",
"jade": "~1.11.0",
"morgan": "~1.6.1",
"serve-favicon": "~2.3.0",
"ect": "~0.5.9"
}
}
app.use(multer({ dest: './upload/'}));
<script src="./javascripts/jquery-2.1.4.min.js"></script>
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
// ECT view engine setup
var ECT = require('ect');
var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext: '.ect'});
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ect');
app.engine('ect', ectRenderer.render);
// routes setup
var routes = require('./routes/index');
var test = require('./routes/test');
app.use('/', routes);
app.use('/test', test);
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('test');
});
module.exports = router;
var array = new Array();
array[array.length] = { "id": 1, "description": "description1" };
array[array.length] = { "id": 2, "description": "description2" };
array[array.length] = { "id": 3, "description": "description3" };