使用node搭建簡單服務(wù)器接收請求返回數(shù)據(jù)

1) 首先安裝node

可以參考菜鳥教程node.js安裝配置拼坎,或者自行搜索安裝教程争便,訪問官網(wǎng)下載慢的這里提供node-v8.40.msi安裝包下載级零,百度網(wǎng)盤地址鏈接:https://pan.baidu.com/s/1boWTBQn密碼: w32w;

安裝node 會自動安裝npm包管理工具滞乙;

檢查是否有安裝node和 npm包管理工具奏纪,打開cmd命令行工具,輸入node -v和npm -v酷宵,會輸出對應(yīng)的版本號亥贸,如下所示:

C:\Users\liuzk$ node -vv8.4.0C:\Users\liuzk$ npm -v5.3.0

全局安裝 npm ,最好同時安裝cnpm 淘寶npm鏡像躬窜,如果npm 安裝依賴包的時候報錯浇垦,有時候是網(wǎng)絡(luò)不好,可以使用淘寶鏡像cnpm來安裝荣挨;

npm install -g npm

npm install -g cnpm

2)安裝express應(yīng)用程序生成器

官網(wǎng)

全局安裝express-generator;

npm install -g express-generator

有安裝Git Bash Here等第三方命令行工具男韧,我們打開文件管理,進(jìn)入到想要生成項目的位置后默垄,右鍵打開Git Bash Here 就可以在當(dāng)前位置啟動命令行工具了此虑;

如果沒有安裝git等第三方cmd命令行工具,我們打開文件管理口锭,進(jìn)入到想要生成項目的位置后朦前,直接在地址欄輸入cmd介杆,會在當(dāng)前目錄打開cdm命令行工具;

在我們想要的位置打開命令行工具之后韭寸,就可以開始以下步驟:

創(chuàng)建一個名為myapp的express應(yīng)用程序

express --view=pug myapp

成功后會自動在目標(biāo)位置創(chuàng)建一個名為myapp的項目并生成很多文件春哨,

在命令行最下面有提示,install dependencies: cd myapp && npm install然后run the app: npm start,我們按照提示來恩伺;

進(jìn)入myapp項目赴背;

cdmyapp

安裝package.json文件中的依賴;

npm install

網(wǎng)絡(luò)不好可以用cnpm安裝

cnpm install

運行項目

npm start

在瀏覽器輸入localhost:3000晶渠,會打開一個頁面顯示W(wǎng)elcome to Express凰荚,說明已經(jīng)成功啟動服務(wù)了。

3)配置

打開myapp項目褒脯,可以看到目錄是下面這樣的便瑟;


這個時候,瀏覽器打開localhost:3000/users,可以看到頁面顯示respond with a resource

打開routes 文件夾下的users看到以下代碼:

// routes/users.js文件varexpress =require('express');varrouter = express.Router();/* GET users listing. */router.get('/',function(req, res, next){? res.send('respond with a resource');});module.exports = router;

可以看到頁面顯示的內(nèi)容就是users.js文件中返回的內(nèi)容憨颠,我們定義自己想要返回的內(nèi)容胳徽。

var express = require('express');

var router = express.Router();

/* GET users listing. */

var data = {

? ? 'code':'000',

? ? 'message':'message消息',

? ? 'lists':[

? ? ? ? {

? ? ? ? ? 'naem':'小明',

? ? ? ? ? ? 'age': '12',

? ? ? ? ? ? 'sex':'男'

? ? ? ? },{

? ? ? ? ? 'naem':'小紅',

? ? ? ? ? ? 'age': '12',

? ? ? ? ? ? 'sex':'女'

? ? ? ? }

? ? ]

}

router.get('/', function(req, res, next) {

? res.send(data);

});

module.exports = router;

改了之后再請求沒有改變,查看命令行信息爽彤,304發(fā)現(xiàn)我們的請求給我們緩存了养盗;

GET /users 304 2.543 ms - -

我們重新啟動一下試試,刷新頁面返回:

{"code":"000","message":"message消息","lists": [? ? ? ? {"naem":"小明","age":"12","sex":"男"},? ? ? ? {"naem":"小紅","age":"12","sex":"女"}? ? ]}

這樣雖然可以請求适篙,但是有緩存問題往核,而且接口多的話每次都得配置一個路徑,太復(fù)雜嚷节,所以要封裝一下聂儒,重復(fù)使用,每次請求重新請求不加載緩存硫痰。

在項目下新建一個config文件夾并新建一個api.js,配置一下:

var fs = require('fs');

/**

* 檢查請求的路徑是否存在

* @param apiName 請求路徑

* @param method? 請求方式

* @param params? 請求參數(shù)

* @param res 返回請求

*/

function getDataFromPath (apiName,method,params,res){

? ? if(apiName){

? ? ? ? fs.access(

? ? ? ? ? ? // 提取請求路徑中的js文件

? ? ? ? ? ? apiName.substring(1)+'.js',

? ? ? ? ? ? // 回調(diào)函數(shù)衩婚,檢查請求的路徑是否有效失敗返回一個錯誤參數(shù)

? ? ? ? ? ? function(err){

? ? ? ? ? ? ? ? if(!err){

? ? ? ? ? ? ? ? ? ? // 每次請求都清除模塊緩存重新請求

? ? ? ? ? ? ? ? ? ? delete require.cache[require.resolve('..'+apiName)];

? ? ? ? ? ? ? ? ? ? try{

? ? ? ? ? ? ? ? ? ? ? ? addApiResult(res,require('..'+apiName).getData(method,params));

? ? ? ? ? ? ? ? ? ? }catch(e){

? ? ? ? ? ? ? ? ? ? ? ? console.error(e.stack);

? ? ? ? ? ? ? ? ? ? ? ? res.status(500).send(apiName+' has an error,please check the code.');

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? addApiResult(res);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? );

? ? }else{

? ? ? ? addApiResult(res);

? ? }

};

/**

*? 響應(yīng)頭

* @param res

*/

function addApiHead(res){

? ? res.setHeader('Content-Type', 'application/json;charset=utf-8');

? ? // 跨域

? ? res.header('Access-Control-Allow-Origin', '*');

? ? res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');

? ? res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');

? ? // 控制http緩存

? ? res.header("Cache-Control", "no-cache, no-store, must-revalidate");

? ? res.header("Pragma", "no-cache");

? ? res.header("Expires", 0);

}

/**

* 返回參數(shù),如無返回參數(shù)返回404

* @param res

* @param result

*/

function addApiResult(res,result){

? ? if(result){

? ? ? ? res.send(result);

? ? }else{

? ? ? ? res.status(404).send();

? ? }

}

/*請求方式*/

// get

exports.get = function(req, res){

? ? addApiHead(res);

? ? getDataFromPath(req.path,'GET',req.query,res);

};

// post

exports.post = function(req, res){

? ? addApiHead(res);

? ? getDataFromPath(req.path,'POST',req.body,res);

};

打開根目錄下app.js效斑,在上面引入剛剛新建的文件api.js;

//引入APIvarapi =require('./config/api');

替換請求配置

/*配置請求*/app.get('/',function(req, res){? ? res.send('hello world');});app.get('/api/*', api.get);app.post('/api/*', api.post);

app.js最終代碼:

var express = require('express');

var path = require('path');

var favicon = require('serve-favicon');

var logger = require('morgan');

var cookieParser = require('cookie-parser');

var bodyParser = require('body-parser');

var app = express();

/*引入api*/

var api = require('./config/api');

// view engine setup

app.set('views', path.join(__dirname, 'views'));

app.set('view engine', 'pug');

// uncomment after placing your favicon in /public

//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));

app.use(logger('dev'));

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({ extended: false }));

app.use(cookieParser());

app.use(express.static(path.join(__dirname, 'public')));

//配置請求

app.get('/', function(req, res){

? ? res.send('hello world');

});

app.get('/api/*', api.get);

app.post('/api/*', api.post);

module.exports = app;

根目錄新建api文件夾非春,新建demo.js;

var dataDemo={

? ? 'code':'000',

? ? 'message':'message消息',

? ? 'lists':[

? ? ? ? {

? ? ? ? ? ? 'naem':'小明',

? ? ? ? ? ? 'age': '12',

? ? ? ? ? ? 'sex':'男'

? ? ? ? },{

? ? ? ? ? ? 'naem':'小紅',

? ? ? ? ? ? 'age': '12',

? ? ? ? ? ? 'sex':'女'

? ? ? ? }

? ? ]

}

exports.getData = function(method,data){

? ? var backData={

? ? ? ? "code":'000',

? ? ? ? "msg":"",

? ? ? ? "data":dataDemo

? ? }

? ? if(method=='DELETE'){

? ? ? ? backData={

? ? ? ? ? ? "code":'999',

? ? ? ? ? ? "msg":"不支持DELETE方法"

? ? ? ? }

? ? }

? ? return JSON.stringify(backData);

}

重新運行npm start,瀏覽器打開localhost:3000缓屠,此時應(yīng)該顯示的是hello world奇昙;

打開localhost:3000/api/demo,頁面顯示

{"code":"000","msg":"","data": {"code":"000","message":"message消息","lists": [? ? ? ? ? ? {"naem":"小明","age":"12","sex":"男"},? ? ? ? ? ? {"naem":"小紅","age":"12","sex":"女"}? ? ? ? ]? ? }}

以上都成功了,那就說明配置成功了敌完,復(fù)制一個js文件命名為demo2.js,改動一下數(shù)據(jù)储耐,瀏覽器訪問localhost:3000/api/demo2應(yīng)該也是可以的;

4) 使用

假如線上接口是https://www.baidu.com/mydata/java/school/list,我們在api文件夾按照路徑新建文件夾和文件即可:

├── api│? └── mydata│? ? ? └── java│? ? ? ? ? └── school│? ? ? ? ? ? ? └──list.js

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滨溉,一起剝皮案震驚了整個濱河市什湘,隨后出現(xiàn)的幾起案子长赞,更是在濱河造成了極大的恐慌,老刑警劉巖闽撤,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涧卵,死亡現(xiàn)場離奇詭異腹尖,居然都是意外死亡柳恐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門乐设,熙熙樓的掌柜王于貴愁眉苦臉地迎上來近尚,“玉大人,你說我怎么就攤上這事格遭【苎福” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵她倘,是天一觀的道長璧微。 經(jīng)常有香客問我,道長硬梁,這世上最難降的妖魔是什么前硫? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮荧止,結(jié)果婚禮上屹电,老公的妹妹穿的比我還像新娘罩息。我一直安慰自己个扰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布娘香。 她就那樣靜靜地躺著,像睡著了一般烘绽。 火紅的嫁衣襯著肌膚如雪淋昭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天安接,我揣著相機(jī)與錄音翔忽,去河邊找鬼。 笑死盏檐,一個胖子當(dāng)著我的面吹牛歇式,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胡野,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼材失,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硫豆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熊响,失蹤者是張志新(化名)和其女友劉穎旨别,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汗茄,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡胆屿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年非迹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纯趋。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吵冒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痹栖,到底是詐尸還是另有隱情,我是刑警寧澤疗我,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布旧找,位于F島的核電站,受9級特大地震影響愿卒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柜候,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辅柴。 院中可真熱鬧碌嘀,春花似錦、人聲如沸止状。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矫付。三九已至妨马,卻和暖如春烘跺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脖咐。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留汇歹,地道東北人屁擅。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓产弹,卻偏偏與公主長得像痰哨,于是被迫代替她去往敵國和親胶果。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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