express實現前后端通信上傳圖片,存儲數據庫(mysql)傻瓜教程(三)完結篇


  終於完成了所有自己想要的功能(鼓勵下自己),雖然還是很簡陋,但是還是挺有滿足感的,哈哈。

  附上前兩篇的鏈接:

  第一篇

  第二篇

  進入正題,在第二篇里面已經完成了連接數據庫,並且實現了對數據庫的增刪改查,下面咱們來實現上傳的圖片存儲數據庫,並且在第二次訪問時返回這張上傳的圖片。

  昨天遇到的問題是這樣的,因為進入首頁時候會讀取模板(routes/index.js),代碼如下:

router.get('/', function(req, res) {
    res.render('index', {
        title: '孟星魂',
    });
});

  所以在此路由下無法再獲取數據(因為第二次訪問頁面的時候要從數據庫請求圖片的路徑),咱們就只能在發送一個請求來獲取數據,所以要使用中間件,路由中間件的用法http://www.expressjs.com.cn/guide/using-middleware.html#middleware.router

  這里的中間件用法如下(也是問題所在,官網上並沒有寫清楚如何在前端發送請求的格式)

router.get('/:id', function(req, res) {
       
    if (req.params.id === "me") {
        //dosomething
    }

})

   前端發送請求是這樣:

$.get('/me', function(data) {
        //do something  
    });

   (是不是很簡單,但就是沒有文檔說明,哭哭哭),express獲取參數有三種方法:

Checks route params (req.params), ex: /user/:id
Checks query string params (req.query), ex: ?id=12
Checks urlencoded body params (req.body), ex: id=  

  1、例如:127.0.0.1:3000/index,這種情況下,我們為了得到index,我們可以通過使用req.params.index得到(咱們的例子用的就是這種方法),通過這種方法我們就可以很好的處理Node中的路由處理問題,同時利用這點可以非常方便的實現MVC模式;

  2、例如:127.0.0.1:3000/index?id=12,這種情況下,這種方式是獲取客戶端get方式傳遞過來的值,通過使用req.query.id就可以獲得,類似於PHP的get方法;

  3、例如:127.0.0.1:3000/index,然后post了一個id=2的值,這種方式是獲取客戶端post過來的數據,可以通過req.body.id獲取,類似於PHP的post方法;


  接下來往get請求中添加回調,主要是訪問數據庫,查詢有沒有圖片的路徑,然后添加到頁面中,代碼如下:

  

router.get('/:id', function(req, res) {
    //創建一個connection   
    if (req.params.id === "me") {
        var connection = mysql.createConnection({
            host: '127.0.0.1',
            user: 'root',
            password: '111',
            port: '3306',
            database: 'nodesample',
        });
        connection.connect(function(err) {
            if (err) {
                console.log('[query] - :' + err);
                return;
            }
            console.log('[connection connect]  succeed!');
        });
        //執行SQL語句
        var userGetSql = 'SELECT * FROM userinfo';
        //
        connection.query(userGetSql, function(err, result) {
            if (err) {
                console.log('[SELECT ERROR] - ', err.message);
                return;
            }
            if (result[0] !== undefined) {
                res.send(result[0])
            }
            console.log('--------------------------SELECT----------------------------');
            console.log(result);
            console.log('-----------------------------------------------------------------\n\n');
        });
        //關閉connection
        connection.end(function(err) {
            if (err) {
                return;
            }
            console.log('[connection end] succeed!');
        });
    }

})

  這里咱們查詢已經建立好的userinfo表,返回的result就是數據庫中的所有數據,命令行里可以看到打印,這里只返回第一條數據,在實際應用中應該還會傳遞一個用戶的id過來,用來匹配數據庫中的數據,在上傳時也會匹配這個id,如果出現相同則會更新掉這條數據,

這些就需要大家自己來動手搞定了,現在保證userinfo表是空的,下次上傳的時候保證會讀到這條數據。

  圖片上傳的代碼修改如下:

router.post('/', function(req, res) {
    // console.log(res);
    // res.send(req.body);
    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();
                }
                var connection = mysql.createConnection({
                    host: '127.0.0.1',
                    user: 'root',
                    password: '111',
                    port: '3306',
                    database: 'nodesample',
                });

                connection.connect();

                var userAddSql = 'INSERT INTO userinfo(Id,UserName,UserPass) VALUES(0,?,?)';
                var userAddSql_Params = ['path', "/upload/" + fName];
                //
                connection.query(userAddSql, userAddSql_Params, function(err, result) {
                    if (err) {
                        console.log('[INSERT ERROR] - ', err.message);
                        return;
                    }

                    console.log('--------------------------INSERT----------------------------');
                    //console.log('INSERT ID:',result.insertId);        
                    console.log('INSERT ID:', result);
                    console.log('-----------------------------------------------------------------\n\n');
                });

                connection.end();
                res.write("<img src='/upload/" + fName + "' />");
                res.end();


            })

        }
    });
});

  就是在上傳圖片后,把圖片的路徑存儲到數據庫中,可以在第二次訪問時返回。

  前端的請求可以這樣寫:

$.get('/me', function(data) {
        if (data !== null || data !== undefined) {
            $("body").append($("<img src=" + data.UserPass + ">"))
        }                   
    });

 

  直接在頁面中append這張圖片,src從返回的數據中獲取。

  好啦,現在大家可以重啟express,上傳一張圖片后,在刷新頁面,便可以看到剛剛上傳的圖片了!!

  好了教程到此圓滿結束了,自己的第一篇博客,寫作過程中收獲頗多,也請大家發現問題,多提意見,不勝感激,最后附上整個項目的源代碼,點擊下載,

  解壓后運行express的啟動代碼就好,運行不成功的先配置好數據庫!!

set DEBUG=myapp & npm start

   mac

DEBUG=myapp npm start

  祝大家好運~

  歡迎任何形式的轉載,但請務必注明原文詳細鏈接

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM