[TIL] Day36- Web Server(3)
28105 ワード
Achievement Goals
Expressライブラリ
サーバの開発とデバッグ
Expressライブラリ
if (req.method === 'POST') {
if (req.url === '/lower') {
let data = '';
req.on('data', chunk => {
data = data + chunk;
});
req.on('end', () => {
data = data.toLowerCase();
res.writeHead(201, defaultCorsHeader);
res.end(data);
});
} else {
res.writeHead(404, defaultCorsHeader);
res.end();
}
}
上記の例では、expressが使用されていない場合、メソッドがPOSTの場合、reqが使用される.urlが「/lower」の場合、POSTが使用するデータもBufferを直接調整する必要があります.const express = require('express')
const app = express()
const jsonParser = express.json({strict:false})
app.post('/lower', jsonParser , function(req,res){
res.json(req.body.toLowerCase());
})
上記の例ではexpressライブラリを使用していますが、メソッドを検索する方法では、メソッドを指定するときに指定された符号化を実行し、Bufferもexpressライブラリを使用しています.その結果、式は未使用のものよりずっと簡単であることがわかります.ルーティングメソッドは、HTTPメソッドから派生し、expressクラスのインスタンスに接続されます.
次のコードは、アプリケーションルートディレクトリのGETメソッドとPOSTメソッドのルーティング例です.
// GET method route
app.get('/', function (req, res) {
res.send('GET request to the homepage');
});
// POST method route
app.post('/', function (req, res) {
res.send('POST request to the homepage');
});
expressがサポートする方法get、post、put、head、delete、options、trace、copy、lock、mkcol、move、purcfind、proppit、unlock、promppatch、unlock、report、mkativity、checkout、m-search、notify、subscribe、unspcribe、patch、connect.
特殊なルーティング方法
app.all()
は、いかなるHTTP方法からも派生しない.このメソッドは、1つのパスですべてのリクエストメソッドにミドルウェア関数をロードするために使用します.正規表現に基づくルーティングパスの例:
次のルーティングパスは、ルーティング名に「a」が含まれているすべてのアイテムと一致します.
app.get(/a/, function(req, res) {
res.send('/a/');
});
複数のコールバック関数は、1つのルーティングを処理できます(次のオブジェクトを指定する必要があります).
app.get('/example/b', function (req, res, next) {
console.log('the response will be sent by the next function ...');
next();
}, function (req, res) {
res.send('Hello from B!');
});
コールバック関数配列は、ルーティングを処理します.var cb0 = function (req, res, next) {
console.log('CB0');
next();
}
var cb1 = function (req, res, next) {
console.log('CB1');
next();
}
var cb2 = function (req, res) {
res.send('Hello from C!');
}
app.get('/example/c', [cb0, cb1, cb2]);
独立した関数と関数配列の組合せは、単一のルーティングを処理することができる.var cb0 = function (req, res, next) {
console.log('CB0');
next();
}
var cb1 = function (req, res, next) {
console.log('CB1');
next();
}
app.get('/example/d', [cb0, cb1], function (req, res, next) {
console.log('the response will be sent by the next function ...');
next();
}, function (req, res) {
res.send('Hello from D!');
});
var app = express();
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
マウントパスなしのミドルウェア関数-要求を受信するたびに正常に動作します.2.構造化POST要求等を含むbody(負荷)の場合(容易に取得したい場合)
上記のexpressを簡略化すると、bodyの構造化が容易になる例が見られる.
3.すべての要求/応答にCORSヘッダを付けなければならない
既存の-writeHeadとendメソッドの使用
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
// 생략
if (req.method === 'OPTIONS') {
res.writeHead(201, defaultCorsHeader);
res.end()
}
corsの使用//1. 모든 요청/응답에 CORS헤더를 붙일 때
const cors = require('cors')
app.use(cors())
//2. 특정 메소드에만 붙일 때
const cors = require('cors')
app.get('/products/:id', cors(), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for a Single Route'})
})
4.認証要求ヘッダーにユーザー認証情報が含まれているかどうかを確認する認証情報実装ミドルウェア
httpリクエストにトークンがあるかどうかを判断し、ログインしている場合は成功し、そうでない場合はエラーのミドルウェアを送信します.
app.use((req, res, next) => {
// 토큰이 있는 경우만 받아준다.
if(req.headers.token){
req.isLoggedIn = true;
next()
} else {
res.status(400).send('invalid user')
}
})
ミドルウェアが親ミドルウェアからsendに応答を送信すると、他のミドルウェアは動作しません.また、next()を介して次のミドルウェアに送信しないと、無限ロードに陥る可能性があります.(確認、不確定)サーバの開発とデバッグ
Webサーバの開発によく使われるアプリ.jsフレームワークはこうです.
//外部モジュール
const express = require('express')
//内部モジュール
//グローバル変数
const app = express();
const port = 81;
//ルーティングモジュール
//実行ロジック
app.use(cors());
//useとは?サーバを実行する前にexpressにuseパラメータを登録する
app.use(express.json())
app.get('/', function(req, res) {
res.status(200).send("Welcome!");
})
//expressで登録してあげますか?
//getはuseに基づいて実装されます(useはexpressに通知されます)
//=> app.listenサーバを実行するロール
//app.listen(port, callback() => {
console.log('start server')
})
大きく五つに分けて書くのが一般的なアプリですjs、特に
app.listen(port, callback() => {
console.log('start server')
上のlistenはサーバの実行を担当していますが、それがなければサーバは動作しません.postman/nodemon/express/node debugなどを使用します.
postmanでは,GUIにより直接サーバにメソッドを要求してもよいし,応答を受信してもよい.
Nodemonの場合、元のサーバのコードを変更するたびにサーバを再起動する必要がありますが、nodemonを使用すると保存時に自動的にサーバがリフレッシュされます.
node debugについては、ツールが正しいと思います.
普段CLIではnode appを使用しています.jsまたはnodemon app.jsでサーバーをアクティブにしましたが.
node --inspect app.jsまたはnodemon--inspect app.jsを打つと、クロム開発者ツールが新しいボタンをアクティブにします.
緑のノードアイコンをクリックします.
このように表示されたときappjs上のコンソール.ログを撮って確認できます.
他の授業で学んだことは、スプレーの中で重要なのはすべて問題に答えるのではなく、appです.js/Router.js/Controller.jsを分離してルーティングを行い,様々な方法への応答を行い,最後にappでアクティブ化(?)する.分割する
サーバを学習するとともに,システム分割アプリケーションの確認を行うことが重要である.
サーバーを知っていて、正直面白いと思います.
Reference
この問題について([TIL] Day36- Web Server(3)), 我々は、より多くの情報をここで見つけました https://velog.io/@source39/TIL-Day36-Web-Server3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol