egg直接取req Egg伺服器基礎功能

2021-10-13 17:54:38 字數 4334 閱讀 2837

1. 框架約定目錄規則

1.5 config/config..js: 用於編寫配置檔案;

1.6 config/plugin.js 用於配置需要載入的外掛程式;

2.內建物件

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

ctx - 當前請求的 context 例項。

service - 應用所有的 service。

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

service基類屬性和 controller 基類屬性一致。

3.路由router

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

4.控制器controller

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

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

const= require('egg');classbasecontrollerextendscontroller

success(data) ;

}notfound(msg)

}module.exports = basecontroller;

定義控制器繼承他:

constcontroller = require('../core/base_controller');classpostcontrollerextendscontroller

}5.獲取提交的資料

接收get請求的資料:ctx.request.query 和 ctx.query.id;

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

// config/config.default.js

// 配置安全驗證

config.security = ,};接收路由引數:

6.獲取上傳的檔案

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

// config/config.default.js

exports.multipart = ;

class uploadcontroller extends controller = 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);

// 返回路徑

通過 ctx.cookies可以在 controller 中便捷、安全的設定和讀取 cookie。

classcookiecontrollerextendscontrollerasyncremove()

}需要注意的是,cookie預設不支援中文,可以嘗試轉碼,如encodeuri('中文egg'),然後再轉回來decodeuri(ctx.cookies.get('username'));也可以通過加密的方式處理。

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

maxage: 設定cookie的有效期,單位毫秒,預設瀏覽器關閉消失;

httponly:設定cookie是否允許js訪問,預設true,不允許;

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

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

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

8.session

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

classsessioncontrollerextendscontroller

};注意:設定 session 屬性時不要以 _ 開頭,不能為 isnew

session預設配置如下:

exports.session = ;
也可以針對性設定有效期:

// 如果使用者勾選了 `記住我`,設定 30 天的過期時間if (rememberme) ctx.session.maxage = ms('30d');
重置session的有效期:當使用者 session 的有效期僅剩下最大有效期一半的時候

// config/config.default.jsmodule.exports = ,};
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 = '
';iii. jsonp

在 controller 中,只需要正常編寫即可。使用者請求對應的 url 訪問到這個 controller 的時候,如果 query 中有 _callback=fn 引數,將會返回 jsonp 格式的資料,否則返回json格式的資料。

可配置:

// config/config.default.j***ports.jsonp = ;
iv. 重定向

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

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

使用者如果使用ctx.redirect方法,需要在應用的配置檔案中做如下配置:

// config/config.default.j***ports.security = ;
若使用者沒有配置 domainwhitelist 或者 domainwhitelist陣列內為空,則缺省會對所有跳轉請求放行,即等同於ctx.unsaferedirect(url)

防止使用者直接複製url直接訪問伺服器導致越權問題

此方法僅供參考,不知道能不能防住黑客。string constring 獲取父url 如果不是直接輸入的話就是先前的訪問過來的頁面,要是使用者輸入了,這個父url是不存在的 constring req.getheader referer 當前請求url,去掉幾個可以直接訪問的頁面 string se...

直接呼叫FTP伺服器中Office文件

www.2ppt.cn word excel powerpoint等office元件均提供了直接呼叫ftp伺服器中文件的功能,它可以像處理本地文件一樣方便地對ftp中支援的文件進行開啟 編輯和儲存等操作。實現的方法是 在 開啟 對話方塊中將 查詢範圍 選擇為 ftp位置 然後雙擊 新增 更改ftp位...

通過直接路由實現虛擬伺服器(VS DR)

由 wensong 在 週日,2006 02 26 18 03 提交 跟vs tun方法相同,vs dr利用大多數internet服務的非對稱特點,負載排程器中只負責排程請求,而伺服器直接將響應返回給客戶,可以極大地提高整個集群系統的吞吐量。該方法與ibm的netdispatcher產品中使用的方法...