API 在執(zhí)行過程中的一個基本任務是數(shù)據(jù)驗證。 在本文中,我想向你展示如何為你的數(shù)據(jù)添加防彈驗證,同時返回風格良好的格式。
在 Node.js 中進行自定義數(shù)據(jù)驗證既不容易也不快。 為了覆蓋所有類型的數(shù)據(jù),需要寫許多函數(shù)。 雖然我已經(jīng)嘗試了一些 Node.js 的表單庫 —— Express 和 Koa ——他們從未滿足我的項目需求。 這些擴展庫要么不兼容復雜的數(shù)據(jù)結構,要么在異步驗證出現(xiàn)問題。
使用 Datalize 在 Node.js 中進行表單驗證
這就是為什么我最終決定編寫自己的小巧而強大的表單驗證庫的原因,它被稱為 datalize。 它是可擴展的,因此你可以在任何項目中使用它,并根據(jù)你的要求進行自定義。 它能夠驗證請求的正文、查詢或參數(shù),還支持async 過濾器和復雜的JSON結構,如 數(shù)組 或 嵌套對象。
Github:https://github.com/flowstudio/datalize
配置
Datalize可以通過npm安裝:
npm install --save datalize
要解析請求的正文,你應該使用其他的庫。 如果你還沒有用過,我建議使用 koa-body for Koa 或 body-parser for Express。
你可以將本教程用于已配置好的HTTP API服務器,也可以使用以下簡單的Koa HTTP服務器代碼。
const Koa = require('koa');const bodyParser = require('koa-body');const app = new Koa();const router = new (require('koa-router'))();// helper for returning errors in routesapp.context.error = function(code, obj) {this.status = code;this.body = obj;};// add koa-body middleware to parse JSON and form-data bodyapp.use(bodyParser({enableTypes: ['json', 'form'],multipart: true,formidable: {maxFileSize: 32 * 1024 * 1024,}}));// Routes...// connect defined routes as middleware to Koaapp.use(router.routes());// our app will listen on port 3000app.listen(3000);console.log('🌍 API listening on 3000');但是,這不是生產(chǎn)環(huán)境下的設置(你還應該使用logging,強制 授權, 錯誤處理等),不過這幾行代碼用于向你正常展示后面的例子足夠了。
注意:所有代碼示例都基于 Koa,但數(shù)據(jù)驗證代碼也同樣適用于 Express。 datalize 庫還有一個實現(xiàn) Express 表單驗證的例子。
一個基本的Node.js表單驗證案例
假設你的 API 中有一個 Koa 或 Express Web 寫的服務和一個端點,用于在數(shù)據(jù)庫中創(chuàng)建包含多個字段的用戶數(shù)據(jù)。其中某些字段是必需的,有些字段只能具有特定值,或者必須格式化為正確的類型。
你可以像這樣寫一個簡單的邏輯:
/** * @api {post} / Create a user * ... */router.post('/', (ctx) => { const data = ctx.request.body; const errors = {}; if (!String(data.name).trim()) { errors.name = ['Name is required']; } if (!(/^[/-0-9a-zA-Z/./+_]+@[/-0-9a-zA-Z/./+_]+/.[a-zA-Z]{2,}$/).test(String(data.email))) { errors.email = ['Email is not valid.']; } if (Object.keys(errors).length) { return ctx.error(400, {errors}); } const user = await User.create({ name: data.name, email: data.email, }); ctx.body = user.toJSON();});
新聞熱點
疑難解答
圖片精選