使用Node.js、express和Apollo服務(wù)器創(chuàng)建express - graphql服務(wù)器

來源:https://medium.com/wesionary-team/create-graphql-server-with-node-js-express-apollo-server-cfe1dab9571a

https://github.com/UjjwolKayastha/graphQL-express-api

本教程將指導(dǎo)您創(chuàng)建一個(gè)可以同時(shí)為graphQL和rest服務(wù)器服務(wù)的簡單服務(wù)器策泣。首先衙傀,讓我們來了解一下這些術(shù)語的官方定義。

GraphQL

GraphQL是一種api的查詢語言萨咕,也是一種使用現(xiàn)有數(shù)據(jù)實(shí)現(xiàn)這些查詢的運(yùn)行時(shí)统抬。GraphQL為API中的數(shù)據(jù)提供了一個(gè)完整的、可理解的描述危队,為客戶端提供了精確地要求他們所需要的東西的能力聪建,使API隨著時(shí)間的推移更容易發(fā)展,并支持強(qiáng)大的開發(fā)人員工具茫陆。

Apollo GraphQL

通過將api金麸、數(shù)據(jù)庫和微服務(wù)組合成可以用GraphQL查詢的單個(gè)數(shù)據(jù)圖,簡化了應(yīng)用程序開發(fā)簿盅。

為此挥下,我們使用“apollo-server-express”揍魂,這樣我們就可以同時(shí)托管express和graphQL服務(wù)器。然而棚瘟,為了創(chuàng)建單獨(dú)的GraphQL服務(wù)器现斋,我們將使用“apollo-server”。

Express

快速偎蘸、無約束庄蹋、極簡的Node.js web框架。

讓我們開始構(gòu)建服務(wù)器迷雪。

選擇您選擇的目錄來創(chuàng)建項(xiàng)目目錄蔓肯。

mkdir GraphQL-Express

使用terminal打開文件夾目錄。輸入“npm init -y”命令初始化nodejs項(xiàng)目振乏。這將在當(dāng)前目錄中生成package.json文件蔗包。

讓我們安裝所需的依賴項(xiàng):

你可以使用yarn或npm來安裝依賴項(xiàng)。在本教程中慧邮,我將使用yarn调限。

yarn add nodemon graphql express apollo-server dotenv apollo-server-express

包裝說明:

nodemon:幫助開發(fā)基于node.js的應(yīng)用程序的工具,當(dāng)檢測到目錄中的文件發(fā)生變化時(shí)误澳,它會(huì)自動(dòng)重啟節(jié)點(diǎn)應(yīng)用程序耻矮。

graphql: graphql模塊導(dǎo)出graphql功能的核心子集,用于創(chuàng)建graphql類型的系統(tǒng)和服務(wù)器忆谓。

express:最小且靈活的Node.js web應(yīng)用框架裆装,為web和移動(dòng)應(yīng)用程序提供了一組健壯的特性。

apollo-server:創(chuàng)建簡單的GraphQL服務(wù)器

apollo-server-express: community-maintained開源GraphQL服務(wù)器使用許多Node.js HTTP服務(wù)器框架倡缠。

dotenv: zero-dependency模塊將環(huán)境變量從.env文件加載到process.env哨免。

在本教程中,我將創(chuàng)建一個(gè)單獨(dú)的express服務(wù)器和GraphQL服務(wù)器昙沦,然后將它們集成到一個(gè)服務(wù)于rest端點(diǎn)和GraphQL的服務(wù)器中琢唾。

讓我們創(chuàng)建express服務(wù)器:

在那之前,讓我們用“start”腳本更新我們的package.json:

package.json文件應(yīng)該是這樣的:

{

"name":"graphQL",

"version":"1.0.0",

"description":"",

"main":"index.js",

"scripts": {

"start":"nodemon server.js",

"test":"echo\"Error: no test specified\"&& exit 1"

? },

"keywords": [],

"author":"",

"license":"ISC",

"dependencies": {

"apollo-server-express":"^2.19.1",

"dotenv":"^8.2.0",

"express":"^4.17.1",

"graphql":"^15.4.0",

"nodemon":"^2.0.6"

? }

}

1盾饮、在根目錄下創(chuàng)建server.js和.env文件采桃,并輸入以下代碼。

touch server.js .env

在.env文件中添加以下代碼:PORT=8000并保存文件丘损。

const express = require("express");

require("dotenv").config();

//express server

const app = express();

app.get("/rest", (req, res) => {

? res.json({

? ? data: "API is working...",

? });

});

app.listen(process.env.PORT, () => {

? console.log(`?? Server is running at http://localhost:${process.env.PORT}`);

});

現(xiàn)在我們的服務(wù)器準(zhǔn)備好了普办。

輸入yarn start啟動(dòng)我們的express服務(wù)器。登錄http://localhost:8000/rest徘钥,響應(yīng)如下:

現(xiàn)在衔蹲,讓我們創(chuàng)建graphQL服務(wù)器。

在根目錄下創(chuàng)建gql-server.js文件吏饿,并輸入以下代碼踪危。

touch gql-server.js

const { ApolloServer } = require("apollo-server");

require("dotenv").config();

//graphql server

//types query/mutation/subscription

const typeDefs = `

? ? type Query {

? ? ? ? totalPosts: Int!

? ? }

`;

//resolvers

const resolvers = {

? Query: {

? ? totalPosts: () => 42,

? },

};

const apolloServer = new ApolloServer({

? typeDefs,

? resolvers,

});

apolloServer.listen(process.env.PORT, () => {

? console.log(`?? GRAPHQL Server is running at http://localhost:${process.env.PORT}`);

});

不要忘記更改package.json啟動(dòng)腳本以運(yùn)行“gql-server.js”文件蔬浙。

"scripts": {

"start": "nodemon server.js",

"test": "echo \"Error: no test specified\" && exit 1"

}

我們的Graphql默認(rèn)托管在http://localhost:8000/graphql中

yarn開始啟動(dòng)GraphQL服務(wù)器,該服務(wù)器響應(yīng)Playground如下:在查詢時(shí)贞远,我們得到以下響應(yīng)畴博。

注意:庫中調(diào)用的遠(yuǎn)端的js文件,可能不能正常顯示


最后蓝仲,是時(shí)候?qū)⑦@些服務(wù)器集成到一起了俱病。

我們將處理我們的server.js文件。

注意:不要忘記撤銷package.json文件中的更改以運(yùn)行server.js文件袱结。

更新你的server.js文件亮隙,使它看起來像這樣:

const { ApolloServer } = require("apollo-server-express");

const express = require("express");

require("dotenv").config();

//graphql server

//types query/mutation/subscription

const typeDefs = `

? ? type Query {

? ? ? ? totalPosts: Int!

? ? }

`;

//resolvers

const resolvers = {

? Query: {

? ? totalPosts: () => 42,

? },

};

const apolloServer = new ApolloServer({

? typeDefs,

? resolvers,

});

//express server

const app = express();

apolloServer.applyMiddleware({ app });

app.get("/rest", (req, res) => {

? res.json({

? ? data: "API is working...",

? });

});

app.listen(process.env.PORT, () => {

? console.log(`?? Server is running at http://localhost:${process.env.PORT}`);

});

在這里,變化是:

1、導(dǎo)入的apollo-server-express包:與現(xiàn)有的express服務(wù)器集成垢夹。

2溢吻、為了實(shí)現(xiàn)集成,我們使用了express server作為aploserver的中間件果元。

apolloServer.applyMiddleware({app});

完成所有更改后促王,yarn開始啟動(dòng)為rest端點(diǎn)和graphQL服務(wù)的集成服務(wù)器。

現(xiàn)在我們可以檢查我們的瀏覽器

1. http://localhost:8000/rest

2. 如上述截圖所示而晒,請?jiān)L問http://localhost:8000/graphql蝇狼。

其它:https://blog.appsignal.com/2020/06/03/building-apis-with-graphql-in-your-node-application.html


https://getstream.io/blog/tutorial-create-a-graphql-api-with-node-mongoose-and-express/

https://dev.to/givehug/next-js-apollo-client-and-server-on-a-single-express-app-55l6

https://sysgears.com/articles/how-to-create-an-apollo-react-express-application/

https://www.freecodecamp.org/news/apollo-graphql-how-to-build-a-full-stack-app-with-react-and-node-js/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倡怎,隨后出現(xiàn)的幾起案子迅耘,更是在濱河造成了極大的恐慌,老刑警劉巖监署,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颤专,死亡現(xiàn)場離奇詭異,居然都是意外死亡焦匈,警方通過查閱死者的電腦和手機(jī)血公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缓熟,“玉大人,你說我怎么就攤上這事摔笤」换” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵吕世,是天一觀的道長彰触。 經(jīng)常有香客問我,道長命辖,這世上最難降的妖魔是什么况毅? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任分蓖,我火速辦了婚禮,結(jié)果婚禮上尔许,老公的妹妹穿的比我還像新娘么鹤。我一直安慰自己,他們只是感情好味廊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布蒸甜。 她就那樣靜靜地躺著,像睡著了一般余佛。 火紅的嫁衣襯著肌膚如雪柠新。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天辉巡,我揣著相機(jī)與錄音恨憎,去河邊找鬼。 笑死郊楣,一個(gè)胖子當(dāng)著我的面吹牛框咙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痢甘,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼喇嘱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了塞栅?” 一聲冷哼從身側(cè)響起者铜,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎放椰,沒想到半個(gè)月后作烟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砾医,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年拿撩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片如蚜。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡压恒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出错邦,到底是詐尸還是另有隱情探赫,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布撬呢,位于F島的核電站伦吠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毛仪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一搁嗓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箱靴,春花似錦腺逛、人聲如沸衬潦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽富雅。三九已至澳厢,卻和暖如春首启,著一層夾襖步出監(jiān)牢的瞬間嚷缭,已是汗流浹背屡久。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工蝶桶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慨绳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓真竖,卻偏偏與公主長得像脐雪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子恢共,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容