日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

egg直接取req_Egg服务器基础功能

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 egg直接取req_Egg服务器基础功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 框架約定目錄規則

1.1 app/router.js:用于配置URL路由規則;

1.2 app/controller/** :用于解析用戶的輸入,處理后返回相應的結果;

1.3 app/service/**: 用于編寫業務邏輯層;

1.4 app/public/**: 用于放置靜態資源;

1.5 config/config.{env}.js: 用于編寫配置文件;

1.6 config/plugin.js 用于配置需要加載的插件;

2.內置對象

1. Application:全局應用對象,在一個應用中,只會實例化一個對象;

在繼承于 Controller, Service 基類的實例中,可以通過 this.app 訪問到 Application 對象。

2. Request & Response:可以在 Context 的實例上獲取到當前請求的 Request(ctx.request) 和 Response(ctx.response) 實例;

3. Controller:推薦所有的 Controller 都繼承于該基類實現。該基類屬性有:

ctx - 當前請求的 Context 實例。

app - 應用的 Application 實例。

service - 應用所有的 service。

4. Service:推薦所有的Service都繼承該基類。

Service基類屬性和 Controller 基類屬性一致。

3.路由Router

路由是描述請求URL和具體承擔執行動作的Controller的對應。說的直白點,就是用戶訪問不同的路徑時應該有不同的Controller去響應不同的內容。

4.控制器Controller

1. 控制器的定義以及和路由的關聯

Controller負責解析用戶的輸入,處理后返回響應的結果。所有的Controller 文件都必須放在 app/controller目錄下,支持多級目錄,訪問時可以通過目錄名級聯訪問。如將Controller代碼放到 app/controller/sub/post.js 中,則可以在 router 中這樣使用:

// app/router.js
module.exports = app => {
app.router.post('createPost', '/api/posts', app.controller.sub.post.create);
}

同時,我們也可以自定義基類給控制器繼承,官方案例如下:

// app/core/base_controller.jsconst { Controller } = require('egg');class BaseController extends Controller {get user() {return this.ctx.session.user;
}
success(data) {this.ctx.body = {
success: true,
data,
};
}
notFound(msg) {
msg = msg || 'not found';this.ctx.throw(404, msg);
}
}
module.exports = BaseController;

定義控制器繼承他:

//app/controller/post.jsconst Controller = require('../core/base_controller');class PostController extends Controller {async list() {const posts = await this.service.listByUser(this.user);this.success(posts);
}
}

5.獲取提交的數據

接收GET請求的數據:ctx.request.query 和 ctx.query.id;

接收POST請求的數據:ctx.request.body,而不是 ctx.body;post請求時,會有安全驗證問題,簡單的處理方式是關閉安全驗證:

// config/config.default.js

// 配置安全驗證

config.security = {

csrf: {

enable: false,

ignoreJSON: true,

}

}

Post數據默認大小是100kb,如需調整可在 config/config.default.js 中覆蓋框架的默認值:

module.exports = {? ??????????????? bodyParser: {??? ????????????????????? jsonLimit: '1mb',??? ????????????????????? formLimit: '1mb',? ??????????????? },};

接收路由參數:

// app.get('/projects/:projectId/app/:appId', 'app.listApp');// GET /projects/1/app/2class AppController extends Controller {? async listApp() {??? assert.equal(this.ctx.params.projectId, '1');??? assert.equal(this.ctx.params.appId, '2');? }}

6.獲取上傳的文件

記住了,你要先在 config 文件中啟用 file 模式:

// config/config.default.js
exports.multipart = {
mode: 'file',
};

然后,你就可以參考下面的代碼了:


這里的參考代碼只處理一張圖片,多張圖片循環處理就可以了:

class UploadController extends Controller {

async file() {

const { ctx } = this;

const dest = '/public/upload/';

const file = ctx.request.files[0];

console.log(ctx.request.files);

let to = path.dirname(__dirname) + dest + path.basename(file.filepath);

// 處理文件,比如上傳到云端 或 放到指定的目錄

await fs.copyFileSync(file.filepath, to);

fs.unlinkSync(file.filepath);

console.log(dest);

// 返回圖片路徑

let cluster = this.app.config.cluster.listen;

ctx.body = `http://${cluster.hostname}:${cluster.port}${dest}${path.basename(file.filepath)}`;

}

}

7.Cookie

通過 ctx.cookies可以在 Controller 中便捷、安全的設置和讀取 Cookie。

class CookieController extends Controller {async add() {const ctx = this.ctx;let count = ctx.cookies.get('count');
count = count ? Number(count) : 0;
ctx.cookies.set('count', ++count);
ctx.body = count;
}async remove() {const ctx = this.ctx;const count = ctx.cookies.set('count', null);
ctx.status = 204;
}
}

需要注意的是,cookie默認不支持中文,可以嘗試轉碼,如encodeURI('中文egg'),然后再轉回來decodeURI(ctx.cookies.get('username'));也可以通過加密的方式處理。

清除cookie把值設置為null即可。

在設置cookie時有個對象類型的可選參數,可以對cookie進行相關設置:

maxAge: 設置cookie的有效期,單位毫秒,默認瀏覽器關閉消失;

httpOnly:設置cookie是否允許js訪問,默認true,不允許;

overwrite:如果設置為true,相同的鍵值對會被覆蓋,否則發送兩個;

signed:如果為true表示對cookie進行簽名,不是加密,只是防止被篡改,注意在獲取的時候也要提供該設置進行匹配;

encrypt:是否加密,true加密后客戶端看不到明文,只能在服務器端獲取,注意在獲取的時候也要提供該設置進行匹配;

8.Session

Session 的使用方法非常直觀,直接讀取或者修改就可以,如果要刪除它,直接將它賦值為 null:

class SessionController extends Controller {async deleteSession() {this.ctx.session = null;
}
};

注意:設置 session 屬性時不要以 _ 開頭,不能為 isNew

Session默認配置如下:

exports.session = {? ?????? key: 'EGG_SESS',? ?????? maxAge: 24 * 3600 * 1000, // 1 天? ?????? httpOnly: true,? ?????? encrypt: true,};

也可以針對性設置有效期:

// 如果用戶勾選了 `記住我`,設置 30 天的過期時間if (rememberMe) ctx.session.maxAge = ms('30d');

重置session的有效期:當用戶 Session 的有效期僅剩下最大有效期一半的時候

// config/config.default.jsmodule.exports = {? session: {??? ???? renew: true,? },};

9.調用service

在 Controller 中可以調用任何一個 Service 上的任何方法,同時 Service 是懶加載的,只有當訪問到它的時候框架才會去實例化它。

// 調用 service 進行業務處理const res = await ctx.service.post.create(req);

10.發送HTTP響應

i. 設置status

// 設置狀態碼為 201this.ctx.status = 201;

ii. 設置body

ctx.body 是 ctx.response.body 的簡寫,不要和 ctx.request.body 混淆了;

// 響應內容this.ctx.body = '

Hello

';

iii. JSONP

app.jsonp() 提供的中間件來讓一個 controller 支持響應 JSONP 格式的數據。在路由中,我們給需要支持 jsonp 的路由加上這個中間件:

// app/router.jsmodule.exports = app => {? const jsonp = app.jsonp();? app.router.get('/api/posts/:id', jsonp, app.controller.posts.show);? app.router.get('/api/posts', jsonp, app.controller.posts.list);};

在 Controller 中,只需要正常編寫即可。用戶請求對應的 URL 訪問到這個 controller 的時候,如果 query 中有 _callback=fn 參數,將會返回 JSONP 格式的數據,否則返回JSON格式的數據。

可配置:

// config/config.default.jsexports.jsonp = {? callback: 'callback', // 識別 query 中的 `callback` 參數? limit: 100, // 函數名最長為 100 個字符};

iv. 重定向

? ctx.redirect(url) 如果不在配置的白名單域名內,則禁止跳轉。

? ctx.unsafeRedirect(url) 不判斷域名,直接跳轉,一般不建議使用,明確了解可能帶來的風險后使用。

用戶如果使用ctx.redirect方法,需要在應用的配置文件中做如下配置:

// config/config.default.jsexports.security = {? domainWhiteList:['.domain.com'],? // 安全白名單,以 . 開頭};

若用戶沒有配置 domainWhiteList 或者 domainWhiteList數組內為空,則默認會對所有跳轉請求放行,即等同于ctx.unsafeRedirect(url)

總結

以上是生活随笔為你收集整理的egg直接取req_Egg服务器基础功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲免费视频观看 | 亚洲美女福利视频 | 色爱综合区| 国产第一精品视频 | 欧美激情第1页 | 国产午夜精品一区二区三区视频 | 黄色a一片| 国产一区在线视频 | 国产欧美日韩专区 | 视频福利在线观看 | 久久久久久久久久久久久久av | 先锋资源中文字幕 | 黄色链接视频 | 明星双性精跪趴灌满h | 亚洲色图在线观看视频 | 黑人干亚洲人 | 国产精品羞羞答答在线 | 免费69视频 | 三日本三级少妇三级99 | 日韩免费一区二区 | 激情免费视频 | 大白屁股一区二区视频 | 亚洲三级大片 | 好看的中文字幕av | 国产1区二区 | 免费的污网站 | 成人黄色免费看 | 超碰在线a | 翔田千里x88aⅴ | 91爱爱网站| 91精品国产综合久久精品 | 性视频黄色 | 成人片黄网站色大片免费毛片 | 精品不卡一区 | 2023毛片| 小箩莉末发育娇小性色xxxx | 刘亦菲一区二区三区免费看 | 国产粉嫩呻吟一区二区三区 | 久久网址 | 欧美精品成人一区二区在线观看 | 一本一道精品欧美中文字幕 | 激情综合影院 | 天天碰免费视频 | 涩涩网站免费 | 91精品综合久久 | 国产在线第二页 | 色姑娘久| 牛av| 女色婷婷 | 青娱乐免费在线视频 | 97人人爽人人爽人人爽人人爽 | aaaaa级少妇高潮大片免费看 | 日本在线网站 | 邻居校草天天肉我h1v1 | 日韩每日更新 | 国产一级二级三级在线 | 久久99久久98精品免观看软件 | 亚洲第一精品网站 | 暖暖日本视频 | 国产美女精品视频 | 国产精品久久亚洲 | 国产伦精品一区二区. | 中文字幕亚洲乱码 | 四季av一区二区夜夜嗨 | 综合久久久久综合 | 久草网视频在线观看 | 五月综合激情日本mⅴ | 午夜视频在线网站 | 好吊色av| 在线播放91灌醉迷j高跟美女 | 亚洲成人av免费观看 | 日韩国产精品一区二区三区 | 免费观看在线视频 | 久热热 | 野花社区视频在线观看 | 精品亚洲天堂 | v在线| 国产日韩欧美在线 | mm131美女大尺度私密照尤果 | 亚洲午夜久久久久久久久久久 | 能免费看av的网站 | 波多野结衣国产 | 免费日韩成人 | 一区二区三区免费在线 | 内射无码专区久久亚洲 | av资源网站| 性开放淫合集 | 三级黄色在线视频 | 精品国产乱码久久久久久婷婷 | 自拍偷拍专区 | 看免费黄色片 | 成人av动漫在线观看 | 色无五月| 风间由美在线观看 | 色综合九九 | 亚洲有吗在线 | 在线色导航 | 在线日韩国产 | 免费小视频 |