内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器-創(chuàng)新互聯(lián)

翻譯:瘋狂的技術(shù)宅
原文:https://medium.freecodecamp.org/building-a-simple-node-js-api-in-under-30-minutes-a07ea9e390d2

目前成都創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、北屯網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

Node.js 對(duì)初學(xué)者來說可能是令人望而卻步的,其靈活的結(jié)構(gòu)和缺乏嚴(yán)格的規(guī)范使它看起來很復(fù)雜。

本教程是 Node.js,Express 框架和 MongoDB 的快速指南,重點(diǎn)介紹基本的 REST 路由和基本的數(shù)據(jù)庫交互。你將構(gòu)建一個(gè)簡(jiǎn)單的 API 框架模版,然后可以將其用作任何應(yīng)用。

本教程適用于:你應(yīng)該對(duì) REST API 和 CRUD 操作有基本的了解,還有基本的 JavaScript 知識(shí)。我用的是 ES6(主要是箭頭函數(shù)),但并不是很復(fù)雜。

在本教程中,我們將為創(chuàng)建一個(gè)網(wǎng)絡(luò)筆記應(yīng)用的后端骨架 —— 類似于Google Keep,能夠執(zhí)行所有的四個(gè)CRUD操作:創(chuàng)建、讀取、更新和刪除。

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器

配置

如果你沒有安裝Node,請(qǐng)參閱此處【https://howtonode.org/how-to-install-nodejs】。

創(chuàng)建一個(gè)新目錄,運(yùn)行?npm init,然后按照提示操作,把你的應(yīng)用程序命名為“notable”(或者你可能喜歡的其他名字)。

1npm?init

一旦完成,在你的目錄中會(huì)有一個(gè)?package.json?文件。你可以開始安裝項(xiàng)目所需的依賴項(xiàng)了。

我們將使用 Express 作為自己的框架,MongoDB 作為數(shù)據(jù)庫,還有一個(gè)名為 body-parser 的包來幫助處理 JSON 請(qǐng)求。

1npm?install?--save?express?mongodb@2.2.16?body-parser

我還強(qiáng)烈建議將 Nodemon 安裝為 dev 依賴項(xiàng)。這是一個(gè)非常簡(jiǎn)單的小包,可在文件被更改時(shí)自動(dòng)重啟服務(wù)器。

如果你運(yùn)行:

1npm?install?--save-dev?nodemon

然后將以下腳本添加到?package.json

1//?package.json
2??"scripts":?{
3????"dev":?"nodemon?server.js"
4??},

完整的?package.json?應(yīng)如下所示:

 1//?package.json
2{
3??"name":?"notable",
4??"version":?"1.0.0",
5??"description":?"",
6??"main":?"server.js",
7??"scripts":?{
8????"dev":?"nodemon?server.js"
9??},
10??"author":?"",
11??"license":?"ISC",
12??"dependencies":?{
13????"body-parser":?"^1.15.2",
14????"express":?"^4.14.0",
15????"mongodb":?"^2.2.16"
16??},
17??"devDependencies":?{
18????"nodemon":?"^1.11.0"
19??}
20}

現(xiàn)在,你可以創(chuàng)建?server.js?文件并構(gòu)建 API 了。

我們的服務(wù)器

首先導(dǎo)入?server.js?中的所有依賴項(xiàng)。

1//?server.js
2const?express????????=?require('express');
3const?MongoClient????=?require('mongodb').MongoClient;
4const?bodyParser?????=?require('body-parser');
5const?app????????????=?express();

我們將使用 MongoClient 與數(shù)據(jù)庫進(jìn)行交互。還會(huì)將應(yīng)用初始化為 Express 框架的實(shí)例。

最后一件事就是告訴你的程序開始監(jiān)聽請(qǐng)求。

你可以指定一個(gè)端口,并像這樣開始監(jiān)聽:

1//?server.js
2const?port?=?8000;
3app.listen(port,?()?=>?{
4??console.log('We?are?live?on?'?+?port);
5});

現(xiàn)在,如果你運(yùn)行?npm run dev(或?node server.js,如果你沒有安裝 Nodemon 的話),應(yīng)該在終端中看到“We are live on port 8000”的提示。

你的服務(wù)器已經(jīng)啟動(dòng)了。但它現(xiàn)在還什么也做不了。

接下來讓我們解決這個(gè)問題。

CRUD 路由

對(duì)于本例,你要構(gòu)建4條路由; 創(chuàng)建筆記,閱讀筆記,更新筆記和刪除筆記。

這將使你了解如何使用 Node 構(gòu)建幾乎所有的基本路由。

但是,要測(cè)試你的API,還需要模仿客戶端發(fā)出請(qǐng)求。為此,我們將使用名為 Postman 的優(yōu)秀應(yīng)用。它允許你使用自定義的頭和參數(shù)進(jìn)行簡(jiǎn)單的 HTTP 請(qǐng)求。

安裝Postman,讓我們開始設(shè)置路由。

項(xiàng)目結(jié)構(gòu)

大多數(shù) Node.js 教程(以及許多真實(shí)的案例)都將所有路由放在一個(gè)很大的?routes.js?文件中。這讓我有點(diǎn)不舒服。相比之下,將文件拆到為單獨(dú)的文件夾可以提高可讀性,并使大型應(yīng)用更易于管理。

雖然我們現(xiàn)在做的不是大型應(yīng)用,但仍然可以這樣做。創(chuàng)建以下目錄:一個(gè)?app?文件夾,里面有一個(gè)routes文件夾,routes 里面有?index.js?和?note_routes.js?文件。

1mkdir?app
2cd?app
3mkdir?routes
4cd?routes
5touch?index.js
6touch?note_routes.js

對(duì)于你的簡(jiǎn)單小程序來說,這些目錄可能看起來有些過分,但從一開始就做好總是有意義的。

你的第一個(gè)路由

讓我們從 CRUD 中的 C 開始。你將會(huì)如何創(chuàng)建一個(gè)筆記?

那么,在你開始之前,必須先要打好基礎(chǔ)。在Express中,路由包含在一個(gè)函數(shù)中,該函數(shù)將 Express 實(shí)例和數(shù)據(jù)庫作為參數(shù)。

像這樣:

1//?routes/note_routes.js
2module.exports?=?function(app,?db)?{
3};

然后,你可以通過?index.js?導(dǎo)出此函數(shù):

1//?routes/index.js
2const?noteRoutes?=?require('./note_routes');
3module.exports?=?function(app,?db)?{
4??noteRoutes(app,?db);
5??//?Other?route?groups?could?go?here,?in?the?future
6};

然后導(dǎo)入它以便在?server.js?中使用:

 1//?server.js
2const?express????????=?require('express');
3const?MongoClient????=?require('mongodb').MongoClient;
4const?bodyParser?????=?require('body-parser');
5const?app????????????=?express();
6const?port?=?8000;
7require('./app/routes')(app,?{});
8app.listen(port,?()?=>?{
9??console.log('We?are?live?on?'?+?port);
10});

請(qǐng)注意,由于還沒有設(shè)置數(shù)據(jù)庫,因此只需傳入一個(gè)空對(duì)象。

好的,現(xiàn)在你可以制作自己的 CREATE 路由了。

語法很簡(jiǎn)單:

1//?note_routes.js
2module.exports?=?function(app,?db)?{
3??app.post('/notes',?(req,?res)?=>?{
4????//?You'll?create?your?note?here.
5????res.send('Hello')
6??});
7};

當(dāng)應(yīng)用程序收到對(duì) '/ notes' 路徑的?post?請(qǐng)求時(shí),它將執(zhí)行回調(diào)內(nèi)的代碼 —— request 對(duì)象(包含請(qǐng)求的參數(shù)或JSON)和 response 對(duì)象。

你可以使用 Postman 將 POST 請(qǐng)求發(fā)送到 localhost:8000/notes 來測(cè)試。

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器

你應(yīng)該得到回復(fù):'Hello'。

太好了!你創(chuàng)建了第一個(gè)真正的路由。

下一步是在你的請(qǐng)求中添加一些參數(shù)并在 API 中處理它們,最后添加到你的數(shù)據(jù)庫中。

請(qǐng)求參數(shù)

在 Postman 中,在選擇?x-www-form-urlencoded?單選按鈕后,轉(zhuǎn)到 Body 選項(xiàng)卡并添加一些鍵值對(duì)。

這會(huì)將編碼后的表單數(shù)據(jù)添加到你的請(qǐng)求中,你可以使用 API 處理該請(qǐng)求。

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器

你可以去嘗試更多的設(shè)置項(xiàng)。

現(xiàn)在在你的?note_routes.js?中,讓我們輸出 body 的內(nèi)容。

1//?note_routes.js
2module.exports?=?function(app,?db)?{
3??app.post('/notes',?(req,?res)?=>?{
4????console.log(req.body)
5????res.send('Hello')
6??});
7};

用 Postman 發(fā)送請(qǐng)求,你會(huì)看到……undefined。

不幸的是,Express 無法自行處理 URL 編碼的表單。雖然你確實(shí)安裝了這個(gè) body-parser 包……

 1//?server.
2const?express????????=?require('express');
3const?MongoClient????=?require('mongodb').MongoClient;
4const?bodyParser?????=?require('body-parser');
5const?app????????????=?express();
6const?port?=?8000;
7app.use(bodyParser.urlencoded({?extended:?true?}));
8require('./app/routes')(app,?{});
9app.listen(port,?()?=>?{
10??console.log('We?are?live?on?'?+?port);
11});

Now you should see the body as an object in the terminal.
現(xiàn)在你應(yīng)該將 body 視為終端中的對(duì)象。

1{?title:?'My?Note?Title',?body:?'What?a?great?note.'?}

第一個(gè)路由的最后一步:設(shè)置數(shù)據(jù)庫,然后添加數(shù)據(jù)。

最簡(jiǎn)單方法是通過 mLab 設(shè)置 Mongo 數(shù)據(jù)庫的:它是最小的而且是免費(fèi)的,設(shè)置的速度非??臁?/p>

創(chuàng)建帳戶和 MongoDB 部署后,將用戶的用戶名和密碼添加到數(shù)據(jù)庫:

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器

然后復(fù)制這里第二個(gè) URL:

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器

在項(xiàng)目根目錄的目錄配置中,創(chuàng)建一個(gè)db.js文件。

1mkdir?config?
2cd?config
3touch?db.js

在里面,添加剛才的URL:

1module.exports?=?{
2??url?:?YOUR?URL?HERE
3};

別忘了把你的用戶名和密碼(來自數(shù)據(jù)庫用戶的密碼,而不是你的 mLab 帳戶)添加到URL中。 (如果你要將此項(xiàng)目提交到 Github 上,請(qǐng)確保包含 .gitignore 文件 像這樣, ,不要與任何人分享你的密碼。)

現(xiàn)在在你的?server.js?中,可以用 MongoClient 連接到數(shù)據(jù)庫了,使用它來包裝你的應(yīng)用程序設(shè)置:

 1//?server.js
2const?express????????=?require('express');
3const?MongoClient????=?require('mongodb').MongoClient;
4const?bodyParser?????=?require('body-parser');
5const?db?????????????=?require('./config/db');
6const?app????????????=?express();
7const?port?=?8000;
8app.use(bodyParser.urlencoded({?extended:?true?}));
9MongoClient.connect(db.url,?(err,?database)?=>?{
10??if?(err)?return?console.log(err)
11??require('./app/routes')(app,?database);
12??app.listen(port,?()?=>?{
13????console.log('We?are?live?on?'?+?port);
14??});???????????????
15})

如果你用的是最新版本的 MongoDB(3.0+),請(qǐng)將其修改為:

 1//?server.js
2const?express????????=?require('express');
3const?MongoClient????=?require('mongodb').MongoClient;
4const?bodyParser?????=?require('body-parser');
5const?db?????????????=?require('./config/db');
6const?app????????????=?express();
7const?port?=?8000;
8app.use(bodyParser.urlencoded({?extended:?true?}));
9MongoClient.connect(db.url,?(err,?database)?=>?{
10??if?(err)?return?console.log(err)
11
12??//?Make?sure?you?add?the?database?name?and?not?the?collection?name
13??const?database?=?database.db("note-api")
14??require('./app/routes')(app,?database);
15??app.listen(port,?()?=>?{
16????console.log('We?are?live?on?'?+?port);
17??});???????????????
18})

這是你的基礎(chǔ)架構(gòu)的最后一個(gè)設(shè)置!

添加到你的數(shù)據(jù)庫

MongoDB將數(shù)據(jù)存儲(chǔ)在?collections?中。在你的項(xiàng)目中,你希望將筆記存儲(chǔ)在一個(gè)名為 notes 的 collection 中。

由于將數(shù)據(jù)庫作為路徑中的?db?參數(shù)傳入,因此可以像這樣訪問它:

1db.collection('notes')

創(chuàng)建筆記就像在集合上調(diào)用?insert?一樣簡(jiǎn)單:

1const?note?=?{?text:?req.body.body,?title:?req.body.title}
2??db.collection('notes').insert(note,?(err,?results)?=>?{
3}

插入完成后(或由于某種原因失敗),要么返回錯(cuò)誤或反回新創(chuàng)建的筆記對(duì)象。這是完整的?note_routes.js?代碼:

 1//?note_routes.js
2module.exports?=?function(app,?db)?{
3??const?collection?=?
4??app.post('/notes',?(req,?res)?=>?{
5????const?note?=?{?text:?req.body.body,?title:?req.body.title?};
6????db.collection('notes').insert(note,?(err,?result)?=>?{
7??????if?(err)?{?
8????????res.send({?'error':?'An?error?has?occurred'?});?
9??????}?else?{
10????????res.send(result.ops[0]);
11??????}
12????});
13??});
14};

試試看!使用 Postman 發(fā)送 x-www-form-urlencoded POST 請(qǐng)求,在 Body 選項(xiàng)卡下設(shè)置?title和?body

響應(yīng)應(yīng)如下所示:

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器

如果你登錄mLab,你還應(yīng)該能夠在數(shù)據(jù)庫中看到創(chuàng)建的筆記。

READ 路由

現(xiàn)在可以稍微加快步伐。

假設(shè)你希望通過導(dǎo)航到 localhost:8000/notes/{id} 來獲取剛創(chuàng)建的筆記。這是鏈接應(yīng)該是localhost:8000/notes/585182bd42ac5b07a9755ea3。(如果你沒有得到其中筆記的 ID,可以通過檢查 mLab 或創(chuàng)建一個(gè)新的筆記)。

以下是?note_routes.js?中的內(nèi)容:

 1//?note_routes.js
2module.exports?=?function(app,?db)?{
3??app.get('/notes/:id',?(req,?res)?=>?{
4
5??});
6??app.post('/notes',?(req,?res)?=>?{
7????const?note?=?{?text:?req.body.body,?title:?req.body.title?};
8????db.collection('notes').insert(note,?(err,?result)?=>?{
9??????if?(err)?{?
10????????res.send({?'error':?'An?error?has?occurred'?});?
11??????}?else?{
12????????res.send(result.ops[0]);
13??????}
14????});
15??});
16};

就像以前一樣,你將在數(shù)據(jù)庫 collection 中調(diào)用一個(gè)方法。在這里,它被恰當(dāng)?shù)孛麨?findOne。

 1//?note_routes.js
2module.exports?=?function(app,?db)?{
3??app.get('/notes/:id',?(req,?res)?=>?{
4????const?details?=?{?'_id':?<ID?GOES?HERE>?};
5????db.collection('notes').findOne(details,?(err,?item)?=>?{
6??????if?(err)?{
7????????res.send({'error':'An?error?has?occurred'});
8??????}?else?{
9????????res.send(item);
10??????}
11????});
12??});
13app.post('/notes',?(req,?res)?=>?{
14????const?note?=?{?text:?req.body.body,?title:?req.body.title?};
15????db.collection('notes').insert(note,?(err,?result)?=>?{
16??????if?(err)?{?
17????????res.send({?'error':?'An?error?has?occurred'?});?
18??????}?else?{
19????????res.send(result.ops[0]);
20??????}
21????});
22??});
23};
24

你可以通過?req.params.id?從 URL 參數(shù)中獲取 id。但是,如果你試圖將字符串插入上面的 ?<ID GOES HERE>??位置,它將無法正常工作。

MongoDB 不僅要求 ID 為字符串,還要求 ID 是一個(gè)對(duì)象,它們被之為 ObjectID。

別擔(dān)心,這很容易解決。這是完整的代碼:

 1//?note_routes.js
2var?ObjectID?=?require('mongodb').ObjectID;
3module.exports?=?function(app,?db)?{
4??app.get('/notes/:id',?(req,?res)?=>?{
5????const?id?=?req.params.id;
6????const?details?=?{?'_id':?new?ObjectID(id)?};
7????db.collection('notes').findOne(details,?(err,?item)?=>?{
8??????if?(err)?{
9????????res.send({'error':'An?error?has?occurred'});
10??????}?else?{
11????????res.send(item);
12??????}?
13????});
14??});
15app.post('/notes',?(req,?res)?=>?{
16????const?note?=?{?text:?req.body.body,?title:?req.body.title?};
17????db.collection('notes').insert(note,?(err,?result)?=>?{
18??????if?(err)?{?
19????????res.send({?'error':?'An?error?has?occurred'?});?
20??????}?else?{
21????????res.send(result.ops[0]);
22??????}
23????});
24??});
25};

嘗試使用一個(gè)筆記 ID,它應(yīng)如下所示:

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器

DELETE 路由

實(shí)際上刪除對(duì)象與查找對(duì)象幾乎相同。你只需用?remove?函數(shù)替換?findOne?即可。這是完整的代碼:

 1//?note_routes.js
2//?...
3??app.delete('/notes/:id',?(req,?res)?=>?{
4????const?id?=?req.params.id;
5????const?details?=?{?'_id':?new?ObjectID(id)?};
6????db.collection('notes').remove(details,?(err,?item)?=>?{
7??????if?(err)?{
8????????res.send({'error':'An?error?has?occurred'});
9??????}?else?{
10????????res.send('Note?'?+?id?+?'?deleted!');
11??????}?
12????});
13??});
14//?...

UPDATE 路由

最后一個(gè)! PUT 方法基本上是 READ 和 CREATE 的混合體。你找到該對(duì)象,然后更新它。如果剛才你刪除了數(shù)據(jù)庫中唯一的筆記,那就再創(chuàng)建一個(gè)!

代碼:

 1//?note_routes.js
2//?...
3??app.put('/notes/:id',?(req,?res)?=>?{
4????const?id?=?req.params.id;
5????const?details?=?{?'_id':?new?ObjectID(id)?};
6????const?note?=?{?text:?req.body.body,?title:?req.body.title?};
7????db.collection('notes').update(details,?note,?(err,?result)?=>?{
8??????if?(err)?{
9??????????res.send({'error':'An?error?has?occurred'});
10??????}?else?{
11??????????res.send(note);
12??????}?
13????});
14??});
15//?...

現(xiàn)在你可以更新任何筆記,如下所示:

30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器

請(qǐng)注意這些代碼還不完美 —— 比如你沒有提供正文或標(biāo)題,PUT 請(qǐng)求將會(huì)使數(shù)據(jù)庫中的筆記上的那些字段無效。

API 完成

就這么簡(jiǎn)單!你完成了可以進(jìn)行 CRUD 操作的 Node API。

本教程的目的是讓你熟悉 Express、Node 和 MongoDB —— 你可以用簡(jiǎn)單的程序作為進(jìn)軍更復(fù)雜項(xiàng)目的跳板。

將來我將會(huì)編寫系列教程,用不同的語言和框架創(chuàng)建更簡(jiǎn)單的API。如果你有興趣,請(qǐng)點(diǎn)擊關(guān)注!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前文章:30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://m.rwnh.cn/article36/ddsdpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站微信公眾號(hào)、網(wǎng)站內(nèi)鏈自適應(yīng)網(wǎng)站、響應(yīng)式網(wǎng)站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
鄂温| 大余县| 奇台县| 大荔县| 玉田县| 承德市| 四平市| 江山市| 石屏县| 四子王旗| 大石桥市| 彩票| 滨海县| 满洲里市| 莆田市| 承德县| 贵港市| 蓬安县| 东光县| 聂荣县| 台前县| 健康| 新兴县| 英吉沙县| 曲阳县| 四会市| 承德县| 沽源县| 柘荣县| 南岸区| 尚义县| 多伦县| 永善县| 西峡县| 耒阳市| 浦北县| 安福县| 堆龙德庆县| 赣州市| 商洛市| 乐业县|