欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

30分鐘用Node.js構(gòu)建一個API服務(wù)器的步驟詳解

 更新時間:2019年05月24日 10:47:10   作者:瘋狂的技術(shù)宅  
這篇文章主要介紹了30分鐘用Node.js構(gòu)建一個API服務(wù)器的步驟詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

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

配置

如果你沒有安裝Node,請參閱此處。

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

npm init

一旦完成,在你的目錄中會有一個 package.json 文件。你可以開始安裝項目所需的依賴項了。

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

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

我還強烈建議將 Nodemon 安裝為 dev 依賴項。這是一個非常簡單的小包,可在文件被更改時自動重啟服務(wù)器。

如果你運行:

npm install --save-dev nodemon

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

// package.json
 "scripts": {
  "dev": "nodemon server.js"
 },

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

// package.json
{
 "name": "notable",
 "version": "1.0.0",
 "description": "",
 "main": "server.js",
 "scripts": {
  "dev": "nodemon server.js"
 },
 "author": "",
 "license": "ISC",
 "dependencies": {
  "body-parser": "^1.15.2",
  "express": "^4.14.0",
  "mongodb": "^2.2.16"
 },
 "devDependencies": {
  "nodemon": "^1.11.0"
 }
}

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

我們的服務(wù)器

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

// server.js
const express    = require('express');
const MongoClient  = require('mongodb').MongoClient;
const bodyParser   = require('body-parser');
const app      = express();

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

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

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

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

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

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

接下來讓我們解決這個問題。

CRUD 路由

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

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

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

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

項目結(jié)構(gòu)

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

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

mkdir app
cd app
mkdir routes
cd routes
touch index.js
touch note_routes.js

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

你的第一個路由

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

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

像這樣:

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

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

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

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

// server.js
const express    = require('express');
const MongoClient  = require('mongodb').MongoClient;
const bodyParser   = require('body-parser');
const app      = express();
const port = 8000;
require('./app/routes')(app, {});
app.listen(port, () => {
 console.log('We are live on ' + port);
});

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

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

語法很簡單:

// note_routes.js
module.exports = function(app, db) {
 app.post('/notes', (req, res) => {
  // You'll create your note here.
  res.send('Hello')
 });
};

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

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

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

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

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

請求參數(shù)

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

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

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

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

// note_routes.js
module.exports = function(app, db) {
 app.post('/notes', (req, res) => {
  console.log(req.body)
  res.send('Hello')
 });
};

用 Postman 發(fā)送請求,你會看到……undefined。

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

// server.
const express    = require('express');
const MongoClient  = require('mongodb').MongoClient;
const bodyParser   = require('body-parser');
const app      = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
require('./app/routes')(app, {});
app.listen(port, () => {
 console.log('We are live on ' + port);
});

Now you should see the body as an object in the terminal.

現(xiàn)在你應(yīng)該將 body 視為終端中的對象。

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

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

最簡單方法是通過mLab 設(shè)置 Mongo 數(shù)據(jù)庫的:它是最小的而且是免費的,設(shè)置的速度非???。

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

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

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

mkdir config 
cd config
touch db.js

在里面,添加剛才的URL:

module.exports = {
 url : YOUR URL HERE
};

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

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

// server.js
const express    = require('express');
const MongoClient  = require('mongodb').MongoClient;
const bodyParser   = require('body-parser');
const db       = require('./config/db');
const app      = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
MongoClient.connect(db.url, (err, database) => {
 if (err) return console.log(err)
 require('./app/routes')(app, database);
 app.listen(port, () => {
  console.log('We are live on ' + port);
 });        
})

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

// server.js
const express    = require('express');
const MongoClient  = require('mongodb').MongoClient;
const bodyParser   = require('body-parser');
const db       = require('./config/db');
const app      = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
MongoClient.connect(db.url, (err, database) => {
 if (err) return console.log(err)
           
 // Make sure you add the database name and not the collection name
 const database = database.db("note-api")
 require('./app/routes')(app, database);
 app.listen(port, () => {
  console.log('We are live on ' + port);
 });        
})

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

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

MongoDB將數(shù)據(jù)存儲在 collections 中。在你的項目中,你希望將筆記存儲在一個名為 notes 的 collection 中。

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

db.collection('notes')

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

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

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

// note_routes.js
module.exports = function(app, db) {
 const collection = 
 app.post('/notes', (req, res) => {
  const note = { text: req.body.body, title: req.body.title };
  db.collection('notes').insert(note, (err, result) => {
   if (err) { 
    res.send({ 'error': 'An error has occurred' }); 
   } else {
    res.send(result.ops[0]);
   }
  });
 });
};

試試看!使用 Postman 發(fā)送 x-www-form-urlencoded POST 請求,在 Body 選項卡下設(shè)置 titlebody

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

如果你登錄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)建一個新的筆記)。

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

// note_routes.js
module.exports = function(app, db) {
 app.get('/notes/:id', (req, res) => {
  
 });
 app.post('/notes', (req, res) => {
  const note = { text: req.body.body, title: req.body.title };
  db.collection('notes').insert(note, (err, result) => {
   if (err) { 
    res.send({ 'error': 'An error has occurred' }); 
   } else {
    res.send(result.ops[0]);
   }
  });
 });
};

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

// note_routes.js
module.exports = function(app, db) {
 app.get('/notes/:id', (req, res) => {
  const details = { '_id': <ID GOES HERE> };
  db.collection('notes').findOne(details, (err, item) => {
   if (err) {
    res.send({'error':'An error has occurred'});
   } else {
    res.send(item);
   }
  });
 });
app.post('/notes', (req, res) => {
  const note = { text: req.body.body, title: req.body.title };
  db.collection('notes').insert(note, (err, result) => {
   if (err) { 
    res.send({ 'error': 'An error has occurred' }); 
   } else {
    res.send(result.ops[0]);
   }
  });
 });
};

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

MongoDB 不僅要求 ID 為字符串,還要求 ID 是一個對象,它們被之為 ObjectID。

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

// note_routes.js
var ObjectID = require('mongodb').ObjectID;
module.exports = function(app, db) {
 app.get('/notes/:id', (req, res) => {
  const id = req.params.id;
  const details = { '_id': new ObjectID(id) };
  db.collection('notes').findOne(details, (err, item) => {
   if (err) {
    res.send({'error':'An error has occurred'});
   } else {
    res.send(item);
   } 
  });
 });
app.post('/notes', (req, res) => {
  const note = { text: req.body.body, title: req.body.title };
  db.collection('notes').insert(note, (err, result) => {
   if (err) { 
    res.send({ 'error': 'An error has occurred' }); 
   } else {
    res.send(result.ops[0]);
   }
  });
 });
};

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

DELETE 路由

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

// note_routes.js
// ...
 app.delete('/notes/:id', (req, res) => {
  const id = req.params.id;
  const details = { '_id': new ObjectID(id) };
  db.collection('notes').remove(details, (err, item) => {
   if (err) {
    res.send({'error':'An error has occurred'});
   } else {
    res.send('Note ' + id + ' deleted!');
   } 
  });
 });
// ...

UPDATE 路由

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

代碼:

// note_routes.js
// ...
 app.put('/notes/:id', (req, res) => {
  const id = req.params.id;
  const details = { '_id': new ObjectID(id) };
  const note = { text: req.body.body, title: req.body.title };
  db.collection('notes').update(details, note, (err, result) => {
   if (err) {
     res.send({'error':'An error has occurred'});
   } else {
     res.send(note);
   } 
  });
 });
// ...

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

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

API 完成

就這么簡單!你完成了可以進行 CRUD 操作的 Node API。

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 從零開始學(xué)習(xí)Node.js系列教程二:文本提交與顯示方法

    從零開始學(xué)習(xí)Node.js系列教程二:文本提交與顯示方法

    這篇文章主要介紹了Node.js文本提交與顯示方法,結(jié)合實例形式分析了nodejs基于http的文本提交、傳輸與顯示相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • 實例分析nodejs模塊xml2js解析xml過程中遇到的坑

    實例分析nodejs模塊xml2js解析xml過程中遇到的坑

    這篇文章主要介紹了實例分析nodejs模塊xml2js解析xml過程中遇到的坑,涉及nodejs模塊xml2js解析xml過程中parseString方法參數(shù)使用技巧,需要的朋友可以參考下
    2017-03-03
  • 如何使用npm安裝yarn詳解

    如何使用npm安裝yarn詳解

    Yarn是一個新的快速安全可信賴的可以替代NPM的依賴管理工具,下面這篇文章主要給大家介紹了關(guān)于如何使用npm安裝yarn的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • node.js使用mongoose操作數(shù)據(jù)庫實現(xiàn)購物車的增、刪、改、查功能示例

    node.js使用mongoose操作數(shù)據(jù)庫實現(xiàn)購物車的增、刪、改、查功能示例

    這篇文章主要介紹了node.js使用mongoose操作數(shù)據(jù)庫實現(xiàn)購物車的增、刪、改、查功能,結(jié)合實例形式詳細(xì)分析了node.js使用mongoose框架操作MongoDB數(shù)據(jù)實現(xiàn)購物車增刪改查相關(guān)技巧與使用注意事項,需要的朋友可以參考下
    2019-12-12
  • Node.js使用Middleware中間件教程詳解

    Node.js使用Middleware中間件教程詳解

    中間件(Middleware),特指業(yè)務(wù)流程的中間處理環(huán)節(jié),Express中間件的調(diào)用流程-當(dāng)一個請求處理時,可以連續(xù)調(diào)用多個中間件,從而對這次請求進行預(yù)處理
    2023-04-04
  • NodeJS感知和控制自身進程的運行環(huán)境和狀態(tài)

    NodeJS感知和控制自身進程的運行環(huán)境和狀態(tài)

    NodeJS可以感知和控制自身進程的運行環(huán)境和狀態(tài),也可以創(chuàng)建子進程并與其協(xié)同工作,這使得NodeJS可以把多個程序組合在一起共同完成某項工作,并在其中充當(dāng)膠水和調(diào)度器的作用,和進程管理相關(guān)的API單獨介紹起來比較枯燥,這里從一些典型的應(yīng)用場景出發(fā)
    2024-01-01
  • Node.js API詳解之 dgram模塊用法實例分析

    Node.js API詳解之 dgram模塊用法實例分析

    這篇文章主要介紹了Node.js API詳解之 dgram模塊用法,結(jié)合實例形式分析了Node.js API中dgram模塊基本功能、函數(shù)、使用方法及操作注意事項,需要的朋友可以參考下
    2020-06-06
  • NodeJS中的命令行程序、工程目錄、NPM

    NodeJS中的命令行程序、工程目錄、NPM

    使用NodeJS編寫的東西,要么是一個包,要么是一個命令行程序,而前者最終也會用于開發(fā)后者,一般我們會同時提供命令行模式和API模式兩種使用方式,并且我們會借助三方包來編寫代碼,NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題
    2023-11-11
  • yarn與npm的命令行小結(jié)

    yarn與npm的命令行小結(jié)

    想必最近大家對新的JavaScript包管理工具yarn已經(jīng)有所耳聞,并已通過npm i -g yarn進行了安裝,現(xiàn)在想知道怎么樣使用嗎?如果你了解 npm,你已經(jīng)會很大一部分啦!下面是這篇文章從npm切換到y(tǒng)arn的一些筆記。有需要的朋友們可以參考借鑒。下面來一起看看吧。
    2016-10-10
  • koa2實現(xiàn)登錄注冊功能的示例代碼

    koa2實現(xiàn)登錄注冊功能的示例代碼

    這篇文章主要介紹了koa2實現(xiàn)登錄注冊功能的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論