前端學(xué)習(xí)筆記—Express株灸、MongoDB數(shù)據(jù)庫(kù)、接口代理請(qǐng)求

Express使用

"Express"和"Spring Boot"是兩個(gè)流行的后端開(kāi)發(fā)框架擎值,分別用于JavaScript和Java語(yǔ)言慌烧。


Express.png
// ===============準(zhǔn)備工作===================
//安裝在根目錄和boService文件夾目錄下都行。按住boService右鍵'在集成終端中打開(kāi)'
//1.cmd創(chuàng)建鸠儿,初始化npm
//npm init --yes
//2.安裝express框架
//npm i express
//3.創(chuàng)建接口
// ==================================

// 創(chuàng)建express框架服務(wù)屹蚊,創(chuàng)建簡(jiǎn)易接口數(shù)據(jù)===>根目錄/boService/expressBoService.js

//1.引入express
const expressBo = require('express');

//2.創(chuàng)建應(yīng)用對(duì)象
const myAppInterface = expressBo();

//3.使用 body-parser 中間件來(lái)解析數(shù)據(jù)
const bodyParser = require('body-parser');//設(shè)置json格式
const mycors = require('cors'); // 引入cors包,解決跨域
myAppInterface.use(bodyParser.urlencoded({ extended: false }));
myAppInterface.use(bodyParser.json());
myAppInterface.use(mycors());

//4.創(chuàng)建路由規(guī)則
//request請(qǐng)求報(bào)文
//response響應(yīng)報(bào)文

myAppInterface.get('/muxiInfo', (request, response) => {
    console.log('--get接收-開(kāi)始');
    //設(shè)置響應(yīng)頭进每,設(shè)置允許跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    // //設(shè)置響應(yīng) send只能發(fā)送字符串
    response.send("哈嘍淑翼,你好呀--GET請(qǐng)求");
});

myAppInterface.post('/muxiInfo', (request, response) => {
    console.log('--post接收-開(kāi)始');
    //設(shè)置響應(yīng)頭,設(shè)置允許跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    //響應(yīng)所有類(lèi)型請(qǐng)求頭
    response.setHeader('Access-Control-Allow-Headers', '*');
    try {
        console.log(request.body);
        const userName = request.body.UserName;
        //json可以發(fā)送json對(duì)象
        response.json({ message: `POST-名字username: ${userName}` });
    } catch (e) {
        response.send("POST請(qǐng)求異常:" + e);
        console.log('--POST請(qǐng)求異常:' + e);
    }
});

//all可以接收容易類(lèi)型的請(qǐng)求get,post,put等
myAppInterface.all('/muxiInfoFrom', (request, response) => {
    console.log('--post接收From-開(kāi)始');
    //設(shè)置響應(yīng)頭品追,設(shè)置允許跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    //響應(yīng)所有類(lèi)型請(qǐng)求頭
    response.setHeader('Access-Control-Allow-Headers', '*');
    try {
        console.log(request.body);
        const userName = request.body.UserName;
        // //設(shè)置響應(yīng) send只能發(fā)送字符串
        response.send("哈嘍,你好呀--POST請(qǐng)求:" + userName);
    } catch (e) {
        response.send("POST請(qǐng)求異常:" + e);
        console.log('--POST請(qǐng)求異常:' + e);
    }
});
//5.監(jiān)聽(tīng)端口冯丙,啟動(dòng)服務(wù)
myAppInterface.listen(8000, () => {
    console.log("我的服務(wù)啟動(dòng)了肉瓦,8000端口監(jiān)聽(tīng)中...");
});
//6.啟動(dòng)服務(wù):當(dāng)前目錄boService文件夾下,右鍵'在集成終端中打開(kāi)'胃惜,在cmd中輸入node expressBoService.js運(yùn)行

MongoDB數(shù)據(jù)庫(kù)創(chuàng)建

在Express中鏈接數(shù)據(jù)庫(kù)通常需要使用第三方庫(kù)或模塊來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作泞莉。最常用的數(shù)據(jù)庫(kù)操作模塊是mongoose用于連接MongoDB數(shù)據(jù)庫(kù),和sequelize用于連接關(guān)系型數(shù)據(jù)庫(kù)如MySQL船殉、PostgreSQL等鲫趁。

代理請(qǐng)求

1.使用中間件方式代理請(qǐng)求
2.自己編寫(xiě)接口轉(zhuǎn)發(fā)請(qǐng)求

// ===============準(zhǔn)備工作===================
//安裝在根目錄和自定義boService文件夾目錄下都行钉疫。按住boService右鍵'在集成終端中打開(kāi)'
//四大步驟
//1.cmd創(chuàng)建,初始化npm
//npm init --yes
//2.安裝express框架
//npm i express
//3.創(chuàng)建接口
//4.終端cmd中輸入node SerProxyApi.js 啟動(dòng)運(yùn)行服務(wù)

// ================開(kāi)始開(kāi)發(fā)==================

// 創(chuàng)建express框架服務(wù)巢价,創(chuàng)建簡(jiǎn)易接口數(shù)據(jù)===>根目錄/boService/SerProxyApi.js

//=》1.引入express
const expressBo = require('express');
//端口號(hào)
const expressServiceHost = 8888;
//=》2.創(chuàng)建應(yīng)用對(duì)象
const myApp = expressBo();

//=》3.使用 body-parser 中間件來(lái)解析數(shù)據(jù)
const bodyParser = require('body-parser');//設(shè)置json格式
const mycors = require('cors'); // 引入cors包牲阁,解決跨域
//這幾個(gè)use()也是中間件
myApp.use(bodyParser.urlencoded({ extended: false }));
myApp.use(bodyParser.json());
myApp.use(mycors());

//------中間件:設(shè)置全局跨域中間件
myApp.all("*", (req, res, next) => {
    console.log('---中間件---跨域設(shè)置-url:', req.url);
    res.header("Access-Control-Allow-Origin", "*");                 // 允許任意外源訪問(wèn)
    res.header("Access-Control-Allow-Headers", "*");        // 自定義請(qǐng)求首部字段,這里是通配符 設(shè)置所有類(lèi)型
    res.header("Access-Control-Allow-Methods", "*");                // 允許所有請(qǐng)求方法
    res.header("Content-Type", "application/json;charset=utf-8");   // 設(shè)置數(shù)據(jù)返回類(lèi)型為json壤躲,字符集為utf8
    console.log('---中間件---跨域設(shè)置-狀態(tài):', res.statusCode);

    if (req.method.toLowerCase() === 'options') {
        res.send(200); // 讓 options 嘗試快速結(jié)束請(qǐng)求
    } else {
        next();
    }
})

//=》4.創(chuàng)建路由規(guī)則
//request請(qǐng)求報(bào)文
//response響應(yīng)報(bào)文

//====方案1===接口代理數(shù)據(jù)連接區(qū)===============》
// 先安裝 http-proxy-middleware庫(kù)城菊,終端命令:npm i http-proxy-middleware
const { createProxyMiddleware } = require('http-proxy-middleware');
//------中間件:請(qǐng)求前中間件
myApp.use('/proxyApi', (req, res, next) => {
    console.log('---代理請(qǐng)求--start:', req.url);
    next();
});

// 創(chuàng)建代理中間件,前端發(fā)出請(qǐng)求 http://localhost:8888/proxyApi/banner/json
const proxy = createProxyMiddleware({
    //原完整地址:https://www.wanandroid.com/banner/json
    // target: '填寫(xiě)可替換“http://localhost:8888/”的域名地址',如:https://www.wanandroid.com/
    target: 'https://www.wanandroid.com/',
    changeOrigin: true,
    pathRewrite: {
        '^/proxyApi': '', // 注意這里路徑重寫(xiě)的變化碉克,api接口地址替換
    },
});

//------中間件:使用代理中間件
myApp.use('/proxyApi', proxy);
//=======接口代理數(shù)據(jù)連接區(qū)===============》

//====方案2===接口轉(zhuǎn)發(fā)請(qǐng)求數(shù)據(jù)連接區(qū)===============》
// 先安裝 axios庫(kù)凌唬,終端命令:npm install axios
const axios = require('axios');

// 假設(shè)你想訪問(wèn)另一個(gè)服務(wù)器的某個(gè)POST接口
// 前端發(fā)出請(qǐng)求 http://localhost:8888/routeApi,json請(qǐng)求參數(shù){apiRouteUrl:詳細(xì)轉(zhuǎn)發(fā)的請(qǐng)求接口地址}
myApp.post('/routeApi', async (req, res) => {
    try {
        console.log('--routeApi-請(qǐng)求返回開(kāi)始:' + req.url);
        const routeurl = req.body.apiRouteUrl;
        console.log('--routeApi-請(qǐng)求開(kāi)始:' + routeurl);
        // const routeurl = 'https://www.wanandroid.com/banner/json';//例子
        // 這里是你要調(diào)用的遠(yuǎn)程服務(wù)的URL和參數(shù)
        //---post請(qǐng)求
        // const response = await axios.post(routeurl, {
        //     username: 'exampleUser',
        //     password: 'examplePassword',
        //     // 其他你需要傳遞的數(shù)據(jù)...
        // });
        //---get請(qǐng)求
        const response = await axios.get(routeurl);

        // 處理響應(yīng)數(shù)據(jù)
        if (response.status === 200) {
            const dataFromOtherServer = response.data;
            console.log('--routeApi-請(qǐng)求返回:' + dataFromOtherServer);
            // res.json({ success: true, data: dataFromOtherServer });
            res.json(dataFromOtherServer);
        } else {
            res.status(response.status).json({ error: 'Failed to fetch from other server' });
        }
    } catch (error) {
        console.error('Error fetching from other server:', error);
        res.status(500).json({ error: 'Internal Server Error' });
    }
});
//=======接口轉(zhuǎn)發(fā)請(qǐng)求數(shù)據(jù)連接區(qū)===============》

// =====================普通接口區(qū)====================》

myApp.get('/muxiInfo', (request, response) => {
    console.log('--get接收-開(kāi)始');
    // //設(shè)置響應(yīng) send只能發(fā)送字符串
    response.send("哈嘍棉胀,你好呀--我是一條GET請(qǐng)求返回內(nèi)容");
});

myApp.post('/muxiInfo', (request, response) => {
    console.log('--post接收-開(kāi)始');
    // //設(shè)置響應(yīng)頭法瑟,設(shè)置允許跨域
    // response.setHeader('Access-Control-Allow-Origin', '*');
    // //響應(yīng)所有類(lèi)型請(qǐng)求頭
    // response.setHeader('Access-Control-Allow-Headers', '*');
    try {
        console.log(request.body);
        const userName = request.body.UserName;
        console.log('--POST接收內(nèi)容:' + userName);
        //json可以發(fā)送json對(duì)象
        response.json({ message: `POST--返回請(qǐng)求內(nèi)容,名字: ${userName}` });
    } catch (e) {
        response.send("POST請(qǐng)求異常:" + e);
        console.log('--POST請(qǐng)求異常:' + e);
    }
});

//all可以接收容易類(lèi)型的請(qǐng)求get,post,put等
myApp.all('/muxiInfoFrom', (request, response) => {
    console.log('--post接收From-開(kāi)始' + request.url);
    try {
        console.log(request.body);
        const userName = request.body.UserName;
        // //設(shè)置響應(yīng) send只能發(fā)送字符串
        response.send("--POST請(qǐng)求-哈嘍唁奢,你好呀--返回內(nèi)容:" + userName);
    } catch (e) {
        response.send("POST請(qǐng)求異常:" + e);
        console.log('--POST請(qǐng)求異常:' + e);
    }
});
// =====================普通接口區(qū)====================》

// =====================中間件處理區(qū)====================》
// >1.放在前面意味著中間件是全局或共享的霎挟,對(duì)所有(包括/muxiInfo)路由生效。
// >2.放在post('/muxiInfo')內(nèi)部作為第三個(gè)參數(shù)麻掸,則中間件只為這個(gè)特定路由服務(wù)酥夭。
// >3.若只是單純地放在post('/muxiInfo')后面,則不直接影響該P(yáng)OST接口處理流程脊奋。
//------中間件:響應(yīng)結(jié)束后
myApp.use((req, res, next) => {
    console.log('---中間件-代理請(qǐng)求end:', req.url);
    // 這里可以訪問(wèn)到代理請(qǐng)求的響應(yīng)
    res.on('finish', () => {
        console.log('---中間件-響應(yīng)完成:', res.statusCode);
    });
    next();
});

//------中間件:用于處理錯(cuò)誤
myApp.use((err, req, res, next) => {
    console.error('---中間件-發(fā)生錯(cuò)誤:', err);
    res.status(500).send('Internal Server Error' + err.message);
});
// =====================中間件處理區(qū)====================》

//=》5.監(jiān)聽(tīng)端口熬北,啟動(dòng)服務(wù)
myApp.listen(expressServiceHost, () => {
    console.log('我的服務(wù)啟動(dòng)了,' + expressServiceHost + '端口監(jiān)聽(tīng)中...');
});
//=》6.啟動(dòng)服務(wù):當(dāng)前目錄boService文件夾下诚隙,右鍵'在集成終端中打開(kāi)'讶隐,在終端cmd中輸入node SerProxyApi.js運(yùn)行

同源策略

瀏覽器才有同源策略。在同源策略中久又,如果兩個(gè)URL具有相同的協(xié)議(protocol)巫延,主機(jī)域名(host)和端口號(hào)(port),則它們被視為同源(origin)地消。

同源策略施加了以下限制:

  • JavaScript 只能訪問(wèn)與其來(lái)源相同的頁(yè)面和代碼炉峰。
  • DOM(文檔對(duì)象模型)限制了對(duì)不同源文檔的訪問(wèn)。
  • XMLHttpRequest 和 Fetch API 限制了對(duì)不同源的 AJAX 請(qǐng)求脉执。

為了允許跨域請(qǐng)求疼阔,可以使用一些機(jī)制,如跨域資源共享(CORS)、服務(wù)器端代理婆廊,以及JSONP等處理這個(gè)問(wèn)題迅细。


同源

同源策略與代理服務(wù)器

CORS簡(jiǎn)單請(qǐng)求跨域?qū)崿F(xiàn)流程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市否彩,隨后出現(xiàn)的幾起案子疯攒,更是在濱河造成了極大的恐慌,老刑警劉巖列荔,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敬尺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贴浙,警方通過(guò)查閱死者的電腦和手機(jī)砂吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崎溃,“玉大人蜻直,你說(shuō)我怎么就攤上這事≡” “怎么了概而?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)囱修。 經(jīng)常有香客問(wèn)我赎瑰,道長(zhǎng),這世上最難降的妖魔是什么破镰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任餐曼,我火速辦了婚禮,結(jié)果婚禮上鲜漩,老公的妹妹穿的比我還像新娘源譬。我一直安慰自己,他們只是感情好孕似,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布踩娘。 她就那樣靜靜地躺著,像睡著了一般喉祭。 火紅的嫁衣襯著肌膚如雪养渴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天臂拓,我揣著相機(jī)與錄音,去河邊找鬼习寸。 笑死胶惰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霞溪。 我是一名探鬼主播孵滞,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼中捆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坊饶?” 一聲冷哼從身側(cè)響起泄伪,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匿级,沒(méi)想到半個(gè)月后蟋滴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痘绎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年津函,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孤页。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尔苦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出行施,到底是詐尸還是另有隱情允坚,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布蛾号,位于F島的核電站稠项,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏须教。R本人自食惡果不足惜皿渗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轻腺。 院中可真熱鬧乐疆,春花似錦、人聲如沸贬养。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)误算。三九已至仰美,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儿礼,已是汗流浹背咖杂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚊夫,地道東北人诉字。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親壤圃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陵霉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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