美文网首页全栈成长之路前端学习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:
  • 735d9b2ddf68:好久上传项目啊,正需要一个例子
  • 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