ホームページ >ウェブフロントエンド >jsチュートリアル >Express は、ストレージ データベース (mysql) に写真をアップロードするためのフロントエンドとバックエンドの通信を実装します。絶対確実なチュートリアル (1)_JavaScript スキル
1年以上フロントエンドピットで奮闘してきましたが、ついに初めてのブログを書く決心をしました(内容はほぼオリジナルですが、統合された内容です)。 Express を使用するのは、画像のアップロードを実現するために、フロントエンドによってアップロードされた画像を受信して返すテストです。バックエンドの皆さんはとても忙しいので、私がやるしかありません(おい、全員追い出された)。
このチュートリアルは、ノードを使用したことがなく、express4.x に基づいて独自のフレームワークを迅速に構築できる Web フロントエンド開発に適しています。
まず Express、http://www.expressjs.com.cn/starter/installing.html をインストールし、インストール プロセス中に最後まで Enter キーを押します。
インストールが完了したら、Express アプリケーション スケルトンのインストールを続行し、デフォルト プロジェクトを生成します
$ npm install express-generator -g
(-g はグローバルインストールを意味します。次回からは再インストールせずに直接使用できます)
その後、myapp フォルダーで直接 Express を実行すると、プロジェクト ディレクトリが直接生成されます
次に、すべての依存パッケージをインストールします。
$ npm install
このアプリを起動します (MacOS または Linux):
$ DEBUG=myapp npm start
Windows プラットフォームで次のコマンドを使用します:
> set DEBUG=myapp & npm start
このページが表示されると、基本的なプロジェクトの構築が完了したことになります。引き続き独自のコードを追加できます。 (このセクションに到達したら、パブリック ディレクトリ内のフォルダーを好みの形式 (js、css など) に変更できます。これは単なるパスです)
次に、独自のページをプロジェクトに追加できますが、これまでのところ、Express が Jade テンプレートと ejs をロードできることがわかっているだけです。ここ http://www.html2jade.org/ では、HTML を Jade テンプレートに変換するツールを直接使用でき、既存のテンプレートを直接追加できます。 Express で Jade テンプレートをロードする方法: http://www.expressjs.com.cn/guide/using-template-engines.html。実際、Jade の記述方法は非常に簡単で、ここをクリックして学習アドレスを参照するだけで始めることができます。 (jade はプロジェクトに統合されているため、再度インストールする必要はありません)
これで全員がコア app.js を開きます
これらの行は、ルーティングの役割を簡単に理解できます。http://www.expressjs.com.cn/guide/routing.html これは非常に重要です。 , 難しいものではないので、すぐに理解できるはずです。
たとえば、http://localhost:3000/users ページを開くと、user.js のコードが一目で理解できます。 (このページを開いたときにgetリクエストが発生しました)
次に、急いで写真をアップロードするのではなく、まず投稿をテストし、フロントエンドから送信されたリクエストを取得してみましょう。
投稿リクエストを例として、layout.jade を以下のように変更します
doctype html html head title= title link(rel='stylesheet', href='/css/style.css') script(type="text/javascript", src="/js/jquery.js") script(type="text/javascript", src="/js/index.js") body block content
public/js の下に新しい Index.js を作成し、jquery (ajax の略称) をロードします。Express の組み込みの Express.static は静的ファイルを簡単にホストできるため、なぜパブリック パスがないのか疑問に思う人もいるかもしれません。画像、CSS、JavaScript ファイルなど。詳細については、ここをクリックしてください。 app.js の対応するコンテンツは app.use(express.static(path.join(__dirname, 'public')));
です。
この方法でのみファイルを読み取ることができます。
js コードの変更を開始しましょう。 public/js/index.js に最も基本的な ajax リクエストを記述します。ここでリクエストを送信するパスは「/」です (ルーティングは必須です)。理解してください、ルーティング あなたは理解する必要があります、あなたはルーティングを理解する必要があります!)
$(document).ready(function() { $.post('/', {num: '12345678' }, function(data) { console.log(data) }); })
次に、routes/index.js の
を変更します。
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); router.post('/', function(req, res) { res.send(req.body.num); }); module.exports = router;
在此监听首页的post请求,req.body.num表示发送过来的数据,大家可以直接打印下req,看看里面包含了什么内容,加深理解(修改完文件后记得重启express)。
这时候在控制台中就可以看到返回的数据了。
现在大家已经可以使用node接收前端发送的请求了(是不是灰长开心!!),下面进行我们的重头戏,上传图片。
因为是测试接口,公司的项目要兼容低版本浏览器,所有plupload.js就上场了(不是我不想用h5的方法)。官网,下载后如图,就够用了。(记得在layout.jade里面加载)
把index.js修改成下面的样子,这是个标准的官网上传事例,不理解的在官网看下api,很好理解(其实看变量名字也都能理解~)
$(document).ready(function() { var uploader = new plupload.Uploader({ runtimes: 'html5,flash,silverlight,html4', browse_button: 'pickfiles', // you can pass an id... container: document.getElementById('container'), // ... or DOM Element itself url: '/', flash_swf_url: '../js/Moxie.swf', silverlight_xap_url: '../js/Moxie.xap', filters: { max_file_size: '10mb', mime_types: [{ title: "Image files", extensions: "jpg,gif,png" }, { title: "Zip files", extensions: "zip" }] }, init: { PostInit: function() { document.getElementById('filelist').innerHTML = ''; document.getElementById('uploadfiles').onclick = function() { uploader.start(); return false; }; }, FilesAdded: function(up, files) { plupload.each(files, function(file) { document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></div>'; }); }, UploadProgress: function(up, file) { document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>"; }, Error: function(up, err) { document.getElementById('console').appendChild(document.createTextNode("\nError #" + err.code + ": " + err.message)); }, FileUploaded: function(up, file, info) { // Called when file has finished uploading $("body").append($(info.response)) }, UploadComplete: function(up, file) { } } }); uploader.init(); })
index.jade修改成下面的样子,主要是添加上传点击的元素,添加了两个按钮而已(不要嫌弃它确实是比较丑--)
extends layout block content h1= title p Welcome to #{title} #filelist #container a#pickfiles select files a#uploadfiles upload files
这里我们要用到的外部模块是Felix Geisendörfer开发的node-formidable模块。它对解析上传的文件数据做了很好的抽象。 其实说白了,处理文件上传“就是”处理POST数据 —— 但是,麻烦的是在具体的处理细节,所以,这里采用现成的方案更合适点。
安装formidable模块。
npm install formidable
修改routes/index.js
var express = require('express'); var router = express.Router(); var fs = require('fs'); var formidable = require("formidable"); /* GET home page. */ router.get('/', function(req, res) { res.render('index', { title: '孟星魂' }); }); router.post('/', function(req, res) { var form = new formidable.IncomingForm(); form.uploadDir = "./public/upload/temp/"; //改变临时目录 form.parse(req, function(error, fields, files) { for (var key in files) { var file = files[key]; var fName = (new Date()).getTime(); switch (file.type) { case "image/jpeg": fName = fName + ".jpg"; break; case "image/png": fName = fName + ".png"; break; default: fName = fName + ".png"; break; } console.log(file, file.size); var uploadDir = "./public/upload/" + fName; fs.rename(file.path, uploadDir, function(err) { if (err) { res.write(err + "\n"); res.end(); } //res.write("upload image:<br/>"); res.write("<img src='/upload/" + fName + "' />"); res.end(); }) } }); });
module.exports = router;
此时需要在public下手动新建文件夹upload以及下面的temp文件夹。
先把文件上传到临时文件夹,再通过fs重命名移动到指定的目录即可。
fs.rename即重命名,但是fs.rename不能夸磁盘移动文件,所以我们需要指定上传的临时目录要和最终目录在同一磁盘下。
res.write就是往前端返回的数据,这里我直接返回一个img标签,并添加上传文件的路径,前端只要把标签append到页面中就ok了。
完成前端图片上传功能!!
今天进行到这里,明天进行讲解node连接数据库的操作。