這次帶給大家Nodejs的form驗證及圖片上傳 ,使用Nodejs的form驗證及圖片上傳注意事項有哪些,以下就是實戰案例,一起來看一下。
一、form驗證
MVC的form驗證有三個地方可以做,第一道關就是前端提交之前,第二道關就是在資料保存之前,也就是在controller中做驗證,第三道關就是資料保存的時候,也就是如果提交的資料模型不符合實體定義的約束,資料是無法保存的,這是最後一道防線。第一道關主要是依賴js或jquery框架,比較常用的是jquery.validate.js。如果是Asp.net MVC 可以自動產生驗證規則,這裡就不細究了,網路上有很多文章。第二層和各自的業務邏輯有關,也需要做一些必要驗證,防止前端禁止JavaScript,而提交不合法數據,這裡是要講基於Mongoose的第三層驗證。
1.回顧模型定義
我們先回顧一下先前用Mongoose定義的book模型:
var bookSchema = new mongoose.Schema({ title: { type: String, required: true }, rating: { type: Number, required: true, min: 0, max: 5 }, info: { type: String, required: true }, img: String, tags: [String], brief: { type: String, required: true }, ISBN: String, });
每個屬性定義了類型和是否必須,還可以加入min ,max,預設值等其他約束。如果提交的模型不滿足這些約束,將無法保存成功。相當於Asp.net MVC中的DataAnnotations的作用。後面的form驗證就基於此。
2.新增路由
我們需要增加4個路由規則,2個用於新增(一個get,一個post),一個用於刪除,一個用於上傳圖片:
router.get('/book/create', homeController.bookcreateview); router.post('/book/create', homeController.doBookCreate); router.delete('/book/:id', homeController.delete); router.post('/uploadImg', homeController.uploadImg);
基於Express的路由,我們可以建立Restful的路由規則。路由位於app_server資料夾下。
3.新增控制器方法
home.bookcreateview:
module.exports.bookcreateview = function (req, res) { res.render('bookCreate', { title: '新增推荐图书' }); };
這裡直接是get請求,所以直接用render去渲染視圖,當然這個bookCreate視圖接下來會建立。
doBookCreate:
module.exports.doBookCreate = function (req, res) { var requestOptions, path, postdata; path = "/api/book"; postdata = { title: req.body.title, info: req.body.info, ISBN: req.body.ISBN, brief: req.body.brief, tags: req.body.tags, img: req.body.img, rating:req.body.rating, }; requestOptions = { url: apiOptions.server + path, method: "POST", json: postdata, }; request(requestOptions, function (err, response, body) { console.log("body.name", body.name, response.statusCode); if (response.statusCode === 201) { res.redirect("/detail/"+body._id); } else if (response.statusCode == 400 && body.name && body.name == "ValidationError") { res.render('bookCreate', { title: '新增推荐图书', error:"val"}); } else { console.log("body.name",body.name); info(res, response.statusCode); } }); };
info:
function info (res, status) { var title, content; if (status === 404) { title = "404, 页面没有找到"; content = "亲,页面飞走了..."; } else if (status === 500) { title = "500, 内部错误"; content = "尴尬...,发生错误"; } else { title = status + ", 有什么不对劲"; content = "某些地方可能有些错误"; } res.status(status); res.render('info', { title : title, content : content, status: status, }); };
View Code
在上一節,我們創建了資料操作的api部分。程式碼的流程就是先從req取得到前端傳過來的數據,然後用request模組呼叫api,如果新增成功(狀態碼是201)就回到detail頁面,如果驗證失敗,就原路返回,並給予提示。如果錯誤,交給info方法去處理。
delete:
module.exports.delete = function (req, res) { var requestOptions, path; path = "/api/book/" + req.params.id; requestOptions = { url: apiOptions.server + path, method: "delete", json: {}, }; request(requestOptions, function (err, response, body) { if (response.statusCode == 204) { res.json(1); } else { res.json(0); } }); };
如果刪除成功,回傳的狀態碼是204,然後回傳json(1)讓前端去處理介面。
4.新增視圖
1) 先需要在圖書清單的右側邊欄增加一個按鈕:
在books檢視中修改:
.col-md-3 .userinfo p stoneniqiu a(href='/book/create').btn.btn-info 新增推荐
當使用者點擊會跳到/book/create頁面
2)新增推薦頁面:
extends layout include _includes/rating block content .row .col-md-12.page.bookdetail h3 新增推荐书籍 .row .col-xs-12.col-md-6 form.form-horizontal(action='',method="post",role="form") - if (error == "val") .alert.alert-danger(role="alert") All fields required, please try again .form-group label.control-label(for='title') 书名 input#name.form-control(name='title') .form-group label.control-label(for='info') 信息 input#name.form-control(name='info') .form-group label.control-label(for='ISBN') ISBN input#name.form-control(name='ISBN') .form-group label.control-label(for='brief') 简介 input#name.form-control(name='brief') .form-group label.control-label(for='tags') 标签 input#name.form-control(name='tags') .form-group label.control-label(for='rating') 推荐指数 select#rating.form-control.input-sm(name="rating") option 5 option 4 option 3 option 2 option 1 .form-group p 上传图片 a.btn.btn-info(id="upload", name="upload") 上传图片 br img(id='img') .form-group button.btn.btn-primary(type='submit') 提交
if語句的地方是用來顯示錯誤提示;圖片上傳,稍後完整介紹;所以提交頁面基本上長成這樣:
#3)Mongoose驗證
這個時候沒有加前端驗證, form可以直接提交。但node印出了錯誤日誌,Book validation failed,驗證失敗。
這是Mongoose給我們回傳的驗證訊息,這時介面上回顯示一個提示訊息:
這是因為在controller中的處理:
else if (response.statusCode == 400 && body.name && body.name == "ValidationError") { res.render('bookCreate', { title: '新增推荐图书', error:"val"}); }
以上说明了Mongoose会在数据保存的时候验证实体,如果实体不满足path规则,将不能保存。但至此有三个问题,第一个问题是提示信息不明确,当然我们可以遍历输出ValidatorError;第二个就是,验证错误之后,页面原来的数据没有了,需要再输入一遍,这个我们可以参考Asp.net MVC将模型数据填充到视图中可以解决;第三个问题就是页面前端还没有验证,form直接就可以提交了,这个可以通过简单的Jquery脚本就可以做到;这三点先不细究。继续往下看,如果规范输入,这个时候是可以提交的,提交之后在books页面可以看到:
4)删除
在标题的右侧增加了一个删除符号(books视图中):
.col-md-10 p a(href="/Detail/#{book._id}")=book.title span.close(data-id='#{book._id}') ×
并添加脚本:
$(".close").click(function() { if (confirm("确定删除?")) { var id = $(this).data("id"); var row = $(this).parents(".booklist"); $.ajax({ url: "/book/" + id, method: "delete", }).done(function(data) { console.log(data); row.fadeOut(); }); } });
脚本可以先位于layout视图下方:
script(src='/javascripts/books.js')
这样,删除完成之后会隐藏当前行。下面解决图片上传问题。
二、图片上传
前面我们在路由里面定义了一个uploadimg方法,现在实现它。一般都涉及两个部分,一个是前台图片的提交,一个是后端数据的处理。
1.uploadimg 方法实现
先需要安装formidable模块。
然后在Public文件下创建一个upload/temp文件夹
脚本:
var fs = require('fs');var formidable = require('formidable'); module.exports.uploadImg = function (req, res) { var form = new formidable.IncomingForm(); //创建上传表单 form.encoding = 'utf-8'; //设置编辑 form.uploadDir = './../public/upload/temp/'; //设置上传目录 form.keepExtensions = true; //保留后缀 form.maxFieldsSize = 3 * 1024 * 1024; //文件大小 form.parse(req, function(err, fields, files) { console.log(files); if (err) { console.log(err); return res.json(0); } for (var key in files) { console.log(files[key].path); var extName = ''; //后缀名 switch (key.type) { case 'image/pjpeg': extName = 'jpg'; break; case 'image/jpeg': extName = 'jpg'; break; case 'image/png': case 'image/x-png': default: extName = 'png'; break; } var avatarName = (new Date()).getTime() + '.' + extName; var newPath = form.uploadDir + avatarName; fs.renameSync(files[key].path, newPath); //重命名 return res.json("/upload/temp/"+ avatarName); } }); };
这个form会自动将文件保存到upLoadDir目录,并以upload_xxxx格式重新命名,所以最后使用fs模块对文件进行重命名。然后返回给前端。
2.前端
我喜欢用插件,前端我用的是plupload-2.1.8,拥有多种上传方式,比较方便。放置在Public文件下。在layout.jade中引用js:
script(src='/plupload-2.1.8/js/plupload.full.min.js') script(src='/javascripts/books.js')
而在bookCreate.jade视图中,修改如下:
a.btn.btn-info(id="upload", name="upload") 上传图片 br img(id='img') input#imgvalue(type='hidden',name='img',value='')
a标签用来触发上传,img用来预览,input用来存放路径。在books.js下增加以下代码:
var uploader = new plupload.Uploader({ runtimes: 'html5,flash,silverlight,html4', browse_button: "upload", url: '/uploadImg', flash_swf_url: '/plupload-2.1.8/js/Moxie.swf', silverlight_xap_url: '/plupload-2.1.8/js/Moxie.xap', filters: { max_file_size: "3mb", mime_types: [ { title: "Image files", extensions: "jpg,gif,png" }, { title: "Zip files", extensions: "zip" } ] }, init: { PostInit: function () { }, FilesAdded: function (up, files) { plupload.each(files, function (file) { uploader.start(); }); }, UploadProgress: function (up, file) { }, Error: function (up, err) { } } }); uploader.init(); uploader.bind('FileUploaded', function (upldr, file, object) { var data = JSON.parse(object.response); console.log(data); $("#img").attr("src", data); $("#imgvalue").val(data);});
提交:
上传成功后跳转到detail页面。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
jQuery、Angular、node中的Promise详解
以上是Nodejs的form驗證及圖片上傳的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

禪工作室 13.0.1
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能