美文网首页全栈成长之路前端学习node
使用 Node.js + Express+MySQL 实现简单

使用 Node.js + Express+MySQL 实现简单

作者: sprint | 来源:发表于2016-07-23 14:41 被阅读20683次

    在上篇文章 使用 Node.js + Express开发服务端 我们已经学习了NodeJS+Express基本用法,你可能会记得我们的API接口返回的数据是假数 据并没有关联数据查询。在本篇文章中我们将实现基本的数据交互并实现简单 的增删改查。如果你还未阅读上篇文章请移步阅读~~~

    1. 准备工作

    首先我们使用Express生成一个空的Express项目

    cd /Users/SPRINT/Desktop 进入桌面
    express MysqlDemo 生成一个MysqlDemo项目
    cd MysqlDemo/  进入项目根目录
    npm install 安装依赖模块
    npm start 启动服务器
    

    启动完成后如果没有错误发生访问 http://localhost:3000/ 将看到 Welcome to Express 信息

    2. 配置MySQL

    确保你电脑中已安装了MySQL环境,我们使用的IDE为MySQLWorkbench. 首先我们新建一个Connection

    1.png

    打开刚刚新建的Connection并新一个数据库并命名为 ExpressDB

    2.png

    接下来我们新建一个 Table 并命名为 User

    3.png

    从上图看到我们增加了两列

    uid INT(11) 用户id
    userName VARCHAR(25) 用户姓名
    

    Mysql的准备到此就准备完成,接下来是我们本篇教程的重点,怎样使用NodeJS+Express链接Mysql

    3. 安装MySQL模块

    打开我们刚刚创建的 MysqlDemo 工程 这里我推荐使用WebStorm 或者 HBuilder 作为演示我们使用 WebStorm 打开工程

    4.png

    首先我们打开 package.json 在 dependencies 选项中添加

    "mysql": "latest"
    

    接着执行如下命令

     npm install 安装mysql依赖
     npm start 启动服务器
    

    接着我们向工程中添加一个 db 目录 用于存放MySQL配置信息
    并在 db 目录总新建一个 DBConfig.js 文件并添加如下内容

    module.exports =
     {  
                 mysql: {   
                             host: '127.0.0.1',     
                             user: 'root',   
                             password: '你的数据库Coonection密码',  
                             database:'ExpressDB', // 前面建的user表位于这个数据库中 
                              port: 3306  
                        }
     };
    

    完成后工程目前的结构如下

    5.png

    4. 添加API接口调用SQL语句

    紧接着我们继续在 db目录中添加 usersql.js 并键入如下内容

    var UserSQL = {  
                    insert:'INSERT INTO User(uid,userName) VALUES(?,?)', 
                    queryAll:'SELECT * FROM User',  
                    getUserById:'SELECT * FROM User WHERE uid = ? ',
                  };
     module.exports = UserSQL;
    

    usersql.js 的主要作用是提供增删改查sql语句。

    紧接着我们还需要在 routes 目录中添加一个users.js 向外暴露我们操作 User 的API接口。
    为了添加测试数据暂时向 users.js 中添加一个 addUser 接口 内容如下

    var express = require('express');
    var router = express.Router();
    // 导入MySQL模块
    var mysql = require('mysql');
    var dbConfig = require('../db/DBConfig');
    var userSQL = require('../db/Usersql');
    // 使用DBConfig.js的配置信息创建一个MySQL连接池
    var pool = mysql.createPool( dbConfig.mysql );
    // 响应一个JSON数据
    var responseJSON = function (res, ret) {
         if(typeof ret === 'undefined') { 
              res.json({     code:'-200',     msg: '操作失败'   
            }); 
        } else { 
          res.json(ret); 
      }};
    // 添加用户
    router.get('/addUser', function(req, res, next){
     // 从连接池获取连接 
    pool.getConnection(function(err, connection) { 
    // 获取前台页面传过来的参数  
     var param = req.query || req.params;   
    // 建立连接 增加一个用户信息 
    connection.query(userSQL.insert, [param.uid,param.name], function(err, result) {
            if(result) {      
                 result = {   
                          code: 200,   
                         msg:'增加成功'
                 };  
            }     
              
         // 以json形式,把操作结果返回给前台页面     
           responseJSON(res, result);   
    
         // 释放连接  
          connection.release();  
    
           });
        });
     });
    

    module.exports = router;

    重点内容已添加了注释,接着我们重新启动服务器 在浏览器访问

    http://localhost:3000/users/addUser?uid=4&name=helloMySQL

    如果添加成功页面将会输出

    {"code":200,"msg":"增加成功"}
    

    其他sql的语法大家可以自行体验,这里就不在一一赘述,如果你在测试过程中遇到问题欢迎留言交流.

    欢迎关注微信公众号:DevTipss

    DevTipss

    相关文章

      网友评论

      • 我想静静_fca0:您好,谢谢您的方法,可以成功插入数据,但是由于是前端新手不知道如何获取数据看的数据,请问您方便抽空指导一二吗?
        原本我是想直接通过,写一个更新数据库字段的
        userSql.js 添加了如下代码
        update: 'UPDATE User SET uid=?,userName=? WHERE uid=?', // 更新数据
        user.js 添加如下代码
        // 更新用户
        router.get('/updateUser',function (req, res, next) {
        pool.getConnection(function (err, connection) {
        var param = req.query || req.params;
        connection.query(userSQL.update, [param.uid,param.name], function (err, result) {
        if(result) {
        result = {
        code: 200,
        msg: '修改成功'
        };
        }
        responseJSON(res, result);
        connection.release();
        });
        });
        });
        然后直接访问链接
        http://localhost:3000/users/updateUser?uid=213&;name=baobao
        但是无法实现,期间还尝试了select语句能正常调用,但是不知道如何把数据输出,drop的方法可以正常删除表
      • 谁把月亮涂黑啦:为啥 workbench 安装会报错,api-ms-win-crt-runtime-l1-1-0.dll 文件缺失,我已经安装了 .net 和 VC 运行库,还是报错,楼主咋装的啊?
        谁把月亮涂黑啦:@sprint 我就是照官网装的啊,找了一天 原来我以前装过 xampp,里面有mysql 集成包。不需要workbench了。
        sprint:@谁把月亮涂黑啦 我是基于 Mac 环境,Windows 不太清楚哦!建议你看下官方文档。
      • 169537fe92e8:不错不错,收藏了。

        推荐下,分库分表中间件 Sharding-JDBC 源码解析 17 篇:http://www.yunai.me/categories/Sharding-JDBC/?jianshu&401


        631d17b59354:赞赞赞
      • 50abe9cbcbb3:不错很有用
      • 小糊涂jun:请问用WebStorm怎么断点调试Express项目?
      • 7fec3fdb4e7b:博主新手求教响应json数据那里失败了,输出是-200,操作失败会是什么原因啊?
        sprint:@zzzLit 可以的 编辑器没要求的
        7fec3fdb4e7b: @sprint 我用的是sublime可以么?
        sprint:@zzzLit 定位下代码 找到-200在哪里输出的?
      • 韩世杰的简述:好多小细节LZ没说明白
      • 韩世杰的简述:此练习不适合新手
      • 韩世杰的简述:“localhost 拒绝了我们的连接请求。”,运行了拒绝访问,新司机很艰难的走到底
        韩世杰的简述:@sprint “localhost 拒绝了我们的连接请求。” 把你的代码复制了一边还是一样,估计没连上服务器
        sprint:@慰农机械 1. localhost和127.0.0.1是一个意思 2. 端口可以修改的但要保证和其它服务没有冲突 这个是可配置的 3. .js可以不加 nodejs会自动处理
        韩世杰的简述:“http://localhost:3306/users/addUser?uid=4&name=helloMySQL”,
        为什么是localhost不是127.0.0.1,
        为什么是3000而不是3306,
        为什么是users而不是users.js,
        跪求回复 : (
      • 38ee399d1b62:我现在要用nodejs+express+mysql做分页,现在还没有思路,能否提供下这方面的思路
        38ee399d1b62:@sprint 你的写法和我不同,我是这么写的
        var express = require('express');
        var app = express();
        //引用db.js
        var db = require("./db.js");
        var router = express.Router();

        //进入查询页面
        router.get('/toquery',function(req,res,next){
        db.query('select * from zhaobin.order',function(err,rows){
        //var user = {username:"赵斌",password:"123456"}
        if(err){
        res.render('error',{title:'error',datas:[]});
        }else{
        res.render('index',{title:'注册',datas:rows,users:res.locals.user});
        }
        });
        });
        //查询
        router.post("/query",function(req,res){
        var oname = req.body.oname;
        var ordernum = req.body.ordernum;
        var sql = 'select * from zhaobin.order ';
        if(oname){
        sql += "and oname like '%"+oname+"%' ";
        }if(ordernum){
        sql += "and ordernum like '%"+ordernum+"%' ";
        }
        sql = sql.replace("and","where");
        db.query(sql,function(err,rows){
        //var user = {username:"赵斌",password:"123456"}
        if(err){
        res.end("查询失败:"+err);
        }else{
        res.render('index',{title:'查询',datas:rows,oname:oname,ordernum:ordernum,users:res.locals.user});
        }
        });
        });

        <body>
        {{if users}}
        <h1>你好{{user.username}}</h1>
        {{/if}}
        <a href="/user/logout">退出</a>
        <form action="/user/query" method="post" id="select">
        订单名:<input name="oname" value="{{oname}}"/>
        订单数量:<input name="ordernum" value="{{ordernum}}"/>
        <!--订购时间: <input name="dealtime" onclick="WdatePicker();" value="{{time}}"/> -->
        <input type="submit" value="提交"/>

        </form>
        <table border="1" cellpadding="3" cellspacing="1">
        <tr>
        <td>订单编号</td>
        <td>订单名</td>
        <td>订购数</td>
        <td><a href="/user/add">添加</a></td>
        <!-- <td>交易时间</td> -->
        <!-- <td></td> -->
        </tr>
        {{each datas as value index}}
        <tr>
        <td>{{value.oid}}</td>
        <td>{{value.oname}}</td>
        <td>{{value.ordernum}}</td>
        <!-- <td>{{value.dealtime}}</td> -->
        <td><a href="/user/delete/{{value.oid}}">删除</a></td>
        <td><a href="/user/toupdate/{{value.oid}}">修改</a></td>
        </tr>
        {{/each}}
        </table>
        </body>
        sprint:这是我这边的写法你可以参考下:

        OrderDao.userOrders = function (query)
        {

        let uid = query["u_id"];
        let status = query["ord_status"];
        let page = query["page"] || 1;

        // 查询指定状态的订单
        if(status)
        {

        return DB.query(SQL_QueryByUID_Status_StartIndex,[uid,status,PageCount * (page - 1)]);

        }else{

        return DB.query(SQL_QueryByUID_StartIndex,[uid,PageCount * (page - 1)]);
        }

        };

        return DB.query(SQL_QueryByUID_StartIndex,[uid,PageCount * (page - 1)]);
        }
        sprint:@赵斌V1 分页使用sql语句 和nodejs关系不大
      • HappyAdu:workbench不会用,博主推荐下学习教程嘛。找了半天没找到好的。最近做课设刚好需要,急用。谢谢啦
        sprint:@HappyAdu 搜索引擎建议使用Google、百度还是算了 浪费生命!另外搜索时只输入关键字即可 例如:workbench 教程 。 自己先动手试试
      • bc5c949cbca4:数据库连不上、求助 :cry:
        bc5c949cbca4:好了,我把error打印出来、发现是我没给数据库配置密码 :sleepy:
      • bc5c949cbca4:E:\mysqlblog\node_modules\mysql\lib\protocol\Parser.js:78
        throw err; // Rethrow non-MySQL errors
        ^

        TypeError: Cannot read property 'query' of undefined
        at E:\mysqlblog\routes\users.js:28:13


        求助 :cry:
      • 玄凌苍:好久上传项目啊,正需要一个例子
      • xiaomayi2012:正需要这方面的内容,,谢谢博主分享。。
        sprint:@xiaomayi2012 我还在写微信公众号 等所有上线了 屏蔽下敏感代码 就发到git上
        xiaomayi2012:@sprint 博主的nodejs服务器项目什么时候开源哈,,好期待哈。。
        sprint:@xiaomayi2012 :pray:应该的
      • _palm:users.js 中 connection.query(... 返回值有可能是除undefined 之外的 '假'值吗?
        _palm:@sprint 谢谢
        sprint:@_palm 文章写的不严谨 应该先判断error知道 如果没有错误信息 一般不会有问题
      • d88a65fdbba7:好喜欢,能不能多讲讲node这方面基础的例子
        d88a65fdbba7:@sprint 么么哒
        sprint:@理工吴彦祖丶 会的会的 在不久我将开源自己的NodeJS服务器项目

      本文标题:使用 Node.js + Express+MySQL 实现简单

      本文链接:https://www.haomeiwen.com/subject/xekwjttx.html