# node js with RESTful API
## 設置
### npm init
建立基本資料
```command=
npm init
```
### npm install package
```command=
npm install express
```
### npm install
直接抓取package-lock.json中所記載的套件版本
並全數安裝
```command=
npm install
```
### npm uninstall
刪除
```command=
npm uninstall express
```
### npm update
更新
```command=
npm update express
```
## import
### 相對
```javascript=
const routers = require('./routes');
```
### npm
```javascript=
const app = require('express');
```
## express
### 簡易 express server
```javascript=
var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require('body-parser');
var port=process.env.PORT || 5000;
//get server
app.get("/"+"js_package.js",function (req,res) {
//get url 上的資料(問號後面的字)
var number=req.query.number
res.end("hello world")
})
var server = app.listen(port, function () {
var host = server.address().address
var port = server.address().port
console.log("應運實力,訪問地址為 http://localhost:%s", port)
//console.log("应用实例,访问地址为 http://%s:%s",host, port)
})
```
### 簡易 express get 回傳檔案
```javascript=
var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require('body-parser');
var port=process.env.PORT || 5000;
//
app.get("/"+"js_package.js",function (req,res) {
res.sendFile(__dirname+"/js_package.js")
})
var server = app.listen(port, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://localhost:%s", port)
//console.log("应用实例,访问地址为 http://%s:%s",host, port)
})
```
### express get 附帶資料
node
```javascript=
app.get('/main', function(req, res) {
var name = 'hello';
res.render(__dirname + "/views/layouts/main.html", {name:name});
});
```
```html=
<h1><%= name %></h1>
```
### 簡易 express 接收 post
```javascript==
var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require('body-parser');
var port=process.env.PORT || 5000;
//接收檔案大小限制為 50MB
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
//post server
app.post('/add_data', function (req, res) {
//post data
var add_data=req.body
data=JSON.parse(data)
res.end("收到"+JSON.stringify(data))
});
})
```
## fs (檔案操作)
### 讀取 同步
```javascript=
var fs = require('fs');
var datafile="./data.json"
var data=fs.readFileSync(datafile)
```
### 讀取 非同步
```javascript=
var fs = require('fs');
var datafile="./data.json"
fs.readFile(datafile, 'utf8', function (err, data) {
console.log(data)
})
```
### 改寫 非同步
```javascript=
var fs = require('fs');
var datafile="./data.json"
var write_data={
"data":"change"
}
fs.writeFile(datafile,JSON.stringify(write_data, null, "\t"), function (err) {
console.error(err)
})
```
## socket.io
server and client 雙向的即時溝通
注意:目前只在筆電測試 似乎只有在用同一個路由器下 訪問ip位置有效
### server node.js
node.js
```javascript=
var http = require("http");
var url = require('url');
var fs = require('fs');
var io = require('socket.io'); // 加入 Socket.IO
var ip = require("ip");//用來取得區域ip
var server = http.createServer(function(request, response) {
console.log('Connection');
var path = url.parse(request.url).pathname;
switch (path) {
case '/':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('Hello, World.');
response.end();
break;
case "/socket.html" :
res.sendFile(__dirname+"/socket.html")
break;
}
}
//取得區域ip
var hostnme=ip.address()
server.listen(8000,hostnme,()=> console.log("work"));
var server_io = io.listen(server);
server_io.sockets.on('connection', function(socket) {
setInterval(function() {
var send_data={
'time': new Date(),
}
socket.emit('server_data', send_data);
//每1秒寄送一次時間
},1000)
//接收client寄來的data
socket.on('client_data', function(data) {
console.log("client_sent_data"+data.tostring())
});
}
```
### client js+html
html
```htmlembedded=
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.1/socket.io.js"></script>
</head>
```
javascript
```javascript=
var socket = io.connect();
//接收來自 server 的資料
socket.on('server_data', function(data){
var sent_data={
'letter': "ok"
}
//回傳訊息給 server
socket.emit('client_data',sent_data );
var delay_time= parseInt(new Date() - Date.parse(data.time))
//顯示延遲時間
document.body.innerHTML="delay"+delay_time+"/ms"
}
```
## pkg (打包成.exe)
### install
``` coommand=
npm install -g pkg
```
### 工作前須知
1. pkg 會自動處理 js 檔案中 __dirname 的部分 所以要全部替換成 __divname
1. 打包時只會打包 package.json 中 bin 的檔案如 果需要靜態檔案 須放在指定資料夾中(package.json pkg assets)
1. 無法做到動態的資料修改或存取
1. 如果要有存取功能應該用 electron
### package.json 中的工作
File Tree
```File Tree=
socket_project
├── node_modules
├── socket.io.js
├── package.json
├── package-lock.json
└── dist
└── socket.html
```
json
```json=
//指定執行黨
"bin":"socket.io.js",
"pkg": {
//靜態檔案存放位置
"assets": [
"dist/**/*"
]
}
```
node.js
socket.io 範例
```javascript=
var http = require("http");
var url = require('url');
var fs = require('fs');
var io = require('socket.io'); // 加入 Socket.IO
var ip = require("ip");
port=8000
//dir 綠色
console.dir ( ip.address() +":"+port+"/socket.html");
//ip localtion by pconfig
var hostnme=ip.address()
var server = http.createServer(function(request, response) {
console.log('Connection');
var path = url.parse(request.url).pathname;
switch (path) {
case '/':
fs.readFile(__dirname+"/dist/socket.html", function(error, data) {
response.writeHead(200, {"Content-Type": "text/html"});
response.write(data, "utf8");
response.end()
})
break;
case '/socket.html':
fs.readFile(__dirname+ "/dist/"+ path, function(error, data) {
if (error){
response.writeHead(404);
response.write("opps this doesn't exist - 404");
} else {
response.writeHead(200, {"Content-Type": "text/html"});
response.write(data, "utf8");
}
response.end();
});
break;
case '/test':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('Hello, World.');
response.end();
break;
default:
response.writeHead(404);
response.write("opps this doesn't exist - 404");
response.end();
break;
}
});
server.listen(port,hostnme,()=> console.log("work"));
var serv_io = io.listen(server);
serv_io.sockets.on('connection', function(socket) {
//發送訊息
var dotime=0
setInterval(function() {
var send_data={
'time': new Date(),
"image":"image_64",
}
socket.emit('server_data', send_data);
//dotime+=1;
dotime++;
},100);
//30fps=33ms
socket.on('client_data', function(data) {
//image_64=data.image
});
//接收
});
```
## 打包
### 只有 window 平台
```command=
pkg -t win package.json
```
### 全平台
```command=
pkg package.json
```