• nodejs+mysql


    接着上一篇的php+mysql,我们来试一试nodejs怎么实现数据的增删查改。

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。我们需要的很多工具都可以直接用npm下载安装,比如前端工业化框架gulp,grunt,fis等,还有css的预处理语言less,都可以在cmd使用npm安装使用。这个以后专开一篇博客介绍。

    回到nodejs,首先怎么安装,我们直接在nodejs的官网或者中文网下载一个稳定版本的安装包就行了,需要注意的是最好安装在默认目录,不然windows系统需要修改环境变量,mac没有用过,请自行百度。

    安装完成以后在桌面新建一个文件夹,进入:

    C:UsersAdmin>cd Desktop
    C:UsersAdminDesktop>mkdir nodejstest
    C:UsersAdminDesktop>cd nodejstest

    在这个目录下使用exoress快速创建一个框架,本次我们只需要安装ejs,如果需要模板引擎的话,可以根据需要安装,具体命令参见http://www.expressjs.com.cn/starter/generator.html。

    然后使用npm install执行安装。

    C:UsersAdminDesktop
    odejstest>express -e

    C:UsersAdminDesktop odejstest>npm install

    这时候刚刚创建的文件夹下面就生成了一些文件,我们把我们的html,css等文件替换到public中。

    执行一下:

    C:UsersAdminDesktop
    odejstest>npm start

    然后在浏览器中访问http://localhost:3000/  就可以看到默认的index.html,或者在他后面加上我们想访问的html。

    这个时候数据库并没有连接,我们可以看到页面报错。

    执行下面的命令把数据库安装到当前的工程:

    C:UsersAdminDesktop
    odejstest>npm install mysql --save-dev

    想要了解更多可以去npm的官网搜索一下mysql,里面会有详细的讲解。

    安装完成后就可以使用他来连接之前的数据库了,打开xampp,开启Mysql。

    下面修改代码:

    把刚才的文件夹拖到编辑器,先看一下生成的app.js:

    我们可以看到他建立了两个路由:

    var routes = require('./routes/index');
    var users = require('./routes/users');

    一个作为用户端,一个作为服务端。

    还建立了两个请求:

    app.use('/', index);
    app.use('/users', users);

    我们修改一下:

    app.use('/news', routes);
    app.use('/admin', users);

    这两句表示,监听3000端口,当获取到发往news的请求时,就进入到routes/index.js中。当获取到发往admin的请求时,就进入到routes/users.js中。

    在我们之前的js文件中,将ajax的url修改掉,比如:

        //获取
        $.ajax({
            url: "/news",
            type: "get",
            datatype: "json",
            data:{"newstype":newsType},
            success: function(data) {
                ...
            },
            error: function(){
                console.log('error');
            }
        });
        //增加
        $.ajax({
            url: "/admin/insert",
            type: "post",
            data: jsonNews,
            datatype: "json",
            success: function(data) {
                ...
            },
            error: function(XHR, textStatus, errorThrown) {
                console.log(textStatus + "ready:" + XHR.readyState);
            }
        });
        //删除
        $.ajax({
            url: "/admin/delete",
            type: "post",
            data: { "newsid": deleteId },
            success: function() {
                ...
            },
            error:function(xhr,status){
                console.log(status);
            }
        });
        //修改获取和提交:
        $.ajax({
            url: "/admin/curnews",
            type: "get",
            datatype: "json",
            data: { "newsid": updateId },
            success: function(data) {
               ...
            }
        });
        $.ajax({
            url: "/admin/update",
            type: "post",
            data: {
                "newstitle": $("#unewsTitle").val(),
                "newstype": $("#unewsType").val(),
                "newsimg": $("#unewsImg").val(),
                "newstime": $("#unewsTime").val(),
                "newssrc": $("#unewsSrc").val(),
                "id": updateId
            },
            success: function(data) {
                ...
            }
        });

    其他内容不变,不再赘述,参见上一篇博客 http://www.cnblogs.com/weirihan/p/6137741.html。

    接下来就是服务器函数,我们在routes下面的js文件中写对应的函数替代之前用php写的server。

    仍旧可以创建一个db.js来连接数据库:

    var mysql = require('mysql');
    
    var connection = mysql.createPool({
        host: 'localhost',
        port: 3306,
        user: 'name',
        password: 'pwd',
        database: 'testabc'
    });
    
    connection.getConnection(function(err,connection){
        if(err){
            console.log("connection false");
        }
    });
    
    exports.connection=connection;

    在index.js中,获取数据:

    var express = require('express');
    var router = express.Router();
    var db = require('./db.js');
    
    /* 在主页获取数据时的请求. */
    router.get('/', function(req, res, next) {
      var newstype = req.query.newstype;
    
      db.connection.query('SELECT * FROM `news` WHERE `newstype` = ?',[newstype],function(err,rows,fields){
              res.json(rows);
      })
    });
    
    module.exports = router;

    在user.js中:

    增加(这里加了一个重复校验):

    /*insert*/
    router.post('/insert', function(req, res) {
        var newstime = req.body.newstime,
            newstype = req.body.newstype,
            newstitle = req.body.newstitle, 
            newsimg = req.body.newsimg,
            newssrc = req.body.newssrc;
        var thistitle = null;
        var count = 0;
      
        /*获取与新增的title一样的数据数目:*/
        db.connection.query('select count(0) as count from news where newstitle=?', [newstitle], function(err, rows) {
            rows.forEach(function(e) {
                count = e.count;
                //console.log("##count = " + count);
            });
            /*有重复:*/
            if (count > 0) { 
                res.json({ "success": "alreadyhad" });
            } else {
                db.connection.query('INSERT INTO `news` (`newstitle`,`newstype`,`newsimg`,`newstime`,`newssrc`) VALUES (?,?,?,?,?)', [newstitle, newstype, newsimg, newstime, newssrc], function(err, result) {
                    if (!err) {
                        //console.log(result.insertId);
                        res.json({ "delete": "success" });
                    } else {
                        res.json({ "delete": "fail" });
                    }
                });
            }
        });   
    });

    修改:

    /*模态框取值*/
    router.get('/curnews', function(req, res) {
        var newsid = req.query.newsid;
        db.connection.query('SELECT *FROM `news` WHERE id=?', [newsid], function(err, rows) {
            res.json(rows);
        })
    });
    
    /*确认更新*/
    router.post('/update', function(req, res) {
        var newsid = req.body.id,
            newstype = req.body.newstype,
            newstitle = req.body.newstitle,
            newsimg = req.body.newsimg,
            newstime = req.body.newstime,
            newssrc = req.body.newssrc;
    
         var thistitle = null;
         var count = 0;
    
         db.connection.query('SELECT *FROM `news` WHERE id=?', [newsid], function(err, rows) {
            rows.forEach(function(e) {
                thistitle = e.newstitle;
                //console.log("##thistitle = " + thistitle);
            });
            /*获取与修改的title一样的数据数:*/
            db.connection.query('select count(0) as count from news where newstitle=?', [newstitle], function(err, rows) {
                rows.forEach(function(e) {
                    count = e.count;
                    //console.log("##count = " + count);
                });
                /*有重复且不是本身:*/
                if ((count > 0) && (newstitle != thistitle)) { 
                    res.json({ "success": "alreadyhad" });
                } else {
                    db.connection.query('UPDATE `news` SET `newstitle`=?,`newstype`=?,`newsimg`=?,`newstime`=?,`newssrc`=? WHERE `id`=?', [newstitle, newstype, newsimg, newstime, newssrc, newsid], function(err, rows) {
                        if (err) {
                            res.json({ "update": "fail" });
                        }else{
                            res.json({ "update": "success" });
                        }
                        
                    });
                }
            });
        });
    });

    删除:

    /*delete*/
    router.post('/delete', function(req, res) {
        var newsid = req.body.newsid;
        db.connection.query('DELETE FROM `news` WHERE `news`.`id`=?', [newsid], function(err, result) {
            //console.log(result.affecteRows);
            if (!err) {
                res.json({ "delete": "success" });
            } else {
                res.json({ "delete": "fail" });
            }
        });
    });

    以上就是nodejs+mysql实现数据库增删查改。

    endding~

  • 相关阅读:
    Mac下安装配置SDK
    macOS brew install 404:Bottle missing, falling back to the default domain错误的修复
    如何修复“无法打开应用,因为Apple无法检查其是否包含恶意软件“
    Selenium4+Python3系列(六) Selenium的三种等待,强制等待、隐式等待、显式等待
    Selenium4.0+Python3系列(四) 常见元素操作(含鼠标键盘事件)
    解决selenium+python 打开浏览器报错 DeprecationWarning executable_path has been deprecated, please pass in a Service object问题
    Selenium4+Python3系列(五) 多窗口处理之句柄切换
    技术团队:给代码评审发起者的4个建议
    中台建设:中台有效落地的6脉神剑
    在代码评审中用好这7招,很容易就能建立起你的反对同盟
  • 原文地址:https://www.cnblogs.com/weirihan/p/6138349.html
Copyright © 2020-2023  润新知