ホームページ > 記事 > ウェブフロントエンド > Nodejsのexpressの詳しい説明
この記事では、node での Express について紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
関連する推奨事項: 「nodejs チュートリアル 」
その前に、非常に便利なノードであるノードデーモンについてお話しましょう> ; 自動コンパイルnpm install nodemon -Dの後、構成ファイル json の「script」オプションの「start」フィールドを次のように変更します:
"start":"nodemon js路径+名", //增加一行 "start:node":"node js路径+名", ...しかし、ここで問題が見つかりました。を使用すると、変更を加えるとノードが再起動されます。 指定するだけです: js ファイルを監視します:
新しい nodemon.json を作成します
{ "watch":["./src/**/*.js"] }(src は json と同じレベルにあります (ここで、jsが見つかります) ディレクトリ名)これ以降、サーバーは自動的に
npm start を実行できます。
npm install express -S # "-S":在生产环境中搭载 npm install nodemon -Dapp.js を src ディレクトリ (自己構築フォルダー) に設定します:
const express=require('express'); //一个express实例 const app=express(); //app.use((req,res)=>{ // res.json({ // name:"张上" // }) //}) app.get('/name',(req,res)=>{ let {age}=req.params; res.send('tom'); }); app.post('/name',(req,res)=>{ res.send('tom post'); }); app.listen(8081,()=>{ console.log('启动成功'); });
コード 3 行目、http について考えたことはありますか?package.json (生成された構成ファイル) を変更します:
const server=http.createServer((req,res)=>{...});ここのサーバーは上記のアプリと同じです。ただし、アプリの req は Express によってカプセル化されており、Express の方が豊富な機能を備えているため、2 つの req は異なります。
// "script"选项下第一个——"start"值中加一个“nodemon”字样: "start":"nodemon ./src/app.js", ...上記のコードでパラメーターを渡すにはどうすればよいですか?
// get方式传参 app.get('/name/:age',(req,res)=>{ let {age}=req.params; res.json({ name:'tom', age }) })
web サービスを使用したリクエストの処理方法 url --> ネットワーク --> DNS 分析 --> ターゲット サーバー
const express=require('express'); const app=express(); //1.请求方法判断 ——测试工具:postman app.get('/demo',(req,res)=>{ res.json({ message:'hello get mxc' }) }); app.post('/demo',(req,res)=>{ res.json({ message:'hello post mxc' }) }); //2.通过URI ——postman上测试:http://127.0.0.1:8081/user/byname?name=mxc //或:http://127.0.0.1:8081/user/byid?id=123 app.get('/user/byname',(req,res)=>{ let {name}=req.query; res.json({ name }) }); app.get('/user/byid',(req,res)=>{ let {id}=req.query; res.json({ id }) }); app.listen(8081,()=>{ console.log('server已启动'); });
ルーティングAPI
クライアントがどのようなリクエストをしても応答を取得できることをクライアントが満足させる必要がある API を定義します。app.all('/demo',(req,res)=>{ res.json({ message:'demo', method:req.method }) });クライアントがどのような URI を使用しても、サービスは応答できます ( log)
app.all('*',(req,res)=>{ res.json({ message:'demo', method:req.method, uri:req.path }) });
app.use --> ミドルウェア
app.use('/demo',(req,res)=>{ res.json({ message:'from use demo', method:req.method }) }); app.use((req,res)=>{ res.json({ message:'demo', method:req.method, uri:req.path }) });
ルーティングを分割するにはどうすればよいですか? —— Express.Router
member.router.js ファイル内:const express=require('express'); const router=express.Router(); //router.[method]//(get/post) //router.all //router.use router.get('/list',(req,res)=>{ res.json({ list:[ id:001, name:'mxc' ] }) }); module.exports=router;app.js "
Register Route":
const memberRouter=require('./member.router.js');app.use(memberRouter);次に、skuRouter の別のルートを作成します。これも URI に「/list」が含まれています。
登録後。見つからない(印刷できない)場合はどうすればよいですか?
const memberRouter=require('./member.router.js'); app.use(memberRouter);
express ミドルウェア
使用法:#最初に、なぜ「ミドルウェア」が必要なのかという質問を考えてみましょう。プログラムは 1 ステップで「完了」することはできません。
たとえば、次のデモを見てみましょう: 入力コンテンツを取得します:<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <form action="http://localhost:8081" method="post"> 用户:<input type="text" name="user" /><br /> 密码:<input type="password" name="pass" /><br /> <input type="submit" value="提交"> </form> </body> </html>
npm install body-parser
const express=require('express'); const bodyParser=require('body-parser'); var server=express(); server.listen(8081); server.use(bodyParser,urlencoded({})); // 上面一行有时也写为:server.use(bodyParser,urlencoded({extended:true})); server.use('/',function(req,res){ console.log(req.body); });これが通常より「余分な」行であることは間違いありません:
server.use(bodyParser, urlencoded({ }));
は、いわゆる「ミドルウェアの使用」です。ここで別の質問について考えてみましょう。プログラムはなぜ「1 ステップで完了できない」のでしょうか?
上記のコードのように、POST の req に「body」を含める必要がありますか?
しかし、今はそれが本当に必要です。したがって、2 行目
const bodyParser=require('body-parser');
一般に、実際の戦闘では、「完全な」パラメータ解析メソッドを形成する 3 つのミドルウェアを作成します。
app.use(express.json()) ;を直接使用するだけです。ミドルウェアは必要ありません。req.query
app.use(express.urlencoded());
app.use(bodyParser,urlencoded({extended:true}));
//その後、get/post オペレーション
もちろん、前の送信が GET モードの場合は、ノード内で
ミドルウェアは非常に「便利」なので、自分でカプセル化してみてはいかがでしょうか?
// 仿body-parser中间件 const querystring=require('querystring'); module.exports=function(req,res,next){ var str=''; req.on('data',function(data){ str+=data; }); req.on('end',function(){ req.body=querystring.parser(str); next(); }); }次に、他のファイルで参照します:
const express=require('express'); const mxcParser=require('./lib/mxc-body-parser'); var server=express(); server.listen(8081); server.use(mxcParser); server.use('/',function(req,res){ console.log(req.body); });
例外処理
一般的なアプローチ:
throw new Error('テスト関数例外');
Node-Express 組み込み例外処理: <pre class="brush:php;toolbar:false">function error_handler_middleware(err,req,res,next){
if(err){
let {message}=err;
res.status(500).json({
message:`${message || '服务器异常'}`
})
}else{
//其余操作
}
}
...
app.use(error_handler_middleware); //放在所有Router最后,做中间件用</pre>
ORM in実戦モデルの作成
mysql を作成した後、ノードを mysql に接続する必要があります。使用したツール:
npm install express mysql2 sequelize nodemon sequelize-cli -S
连接成功后会生成config.json配置文件,我们在development选项中修改和添加:
"database":"数据库表名", "timezone":"+08:00"
持久化模型对应的数据库表:
npx sequelize db:migrate
前端数据如何往mysql中写?
调用todo.js模块:
use strict' ; module. exports = (sequelize, DataTypes) => { const Todo = sequelize.define( 'Todo', { name: DataTypes. STRING, deadLine: DataTypes .DATE, content: DataTypes. STRING },{ timestamps:false }) ; Todo. associate = function(models) { // associations can be def ined here }; return Todo; };
使用:创建第一个todo:(初始时)
app.post('/create',async (req,res,next)=>{ try{ let {name,deadline,content}=req.body; //持久化到数据库 let todo=await models.Todo.create({ name, deadline, content }) res.json({ todo, message:'任务创建成功' }) }catch(err){ next(error) } })
最后的next传给谁?
我们之前说,在全局最后创建一个use,用于错误处理:
app.use((err,req,res,next)=>{ if(err){ res.status(500).json({ message:err.message }) } })
更多编程相关知识,请访问:编程入门!!
以上がNodejsのexpressの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。