MySQL驱动器:node-mysql;

MySQL对象关系映射器:node-sequelize;

例子:

  • package.json:

    {"name": "shopping-cart-example","version": "0.0.1","dependencies": {"express": "2.5.2","jade": "0.19.0","mysql": "0.9.5"}
    }

  • config.json:
    {"host": "localhost","password": "123","database": "cart-example"
    }

  • setup.js:
    var mysql = require('mysql');
    var config = require('./config');//初始化客户端
    delete config.database;
    var db = mysql.createClient(config);//创建数据库
    db.query('CREATE DATABASE IF NOT EXISTS `cart-example`');
    db.query('USE `cart-example`');//创建表
    db.query('DROP TABLE IF EXISTS item');
    db.query('CREATE TABLE item (' + 'id INT(11) AUTO_INCREMENT,' + 'title VARCHAR(255),' +'description TEXT,' + 'created DATETIME,' + 'PRIMARY KEY(id))'
    );
    db.query('DROP TABLE IF EXISTS review');
    db.query('CREATE TABLE review (' + 'id INT(11) AUTO_INCREMENT,' +'item_id INT(11),' +'text TEXT,' +'stars INT(1),' +'created DATETIME,' + 'PRIMARY KEY(id))'
    );//关闭客户端
    db.end(function() {process.exit();
    });

  • server.js:
    var express = require('express');
    var mysql = require('mysql');
    var config = require('./config');app = express.createServer();app.use(express.bodyParser());
    app.set('view engine', 'jade');
    app.set('views','views');
    app.set('view options', {layout: false});//连接数据集
    var db = mysql.createClient(config);//首页路由
    app.get('/', function(req, res, next) {db.query('SELECT id, title, description FROM item', function(err, results) {res.render('index', {items: results});});
    });
    //创建商品的路由
    app.post('/create', function(req, res, next) {//使用?避免字符串拼接,从而避免SQL注入攻击,但需要使用替换数据的第二参数db.query('INSERT INTO item SET title = ?, description = ?',[req.body.title, req.body.description], function(err, info) {if(err) return next(err);//通过info.insertId来创建商品的idconsole.log('-item created with id %s', info.insertId);res.redirect('/');});
    });
    //查看商品路由
    app.get('/item/:id', function(req, res, next) {function getItem (fn) {db.query('SELECT id, title, description FROM item WHERE id= ? LIMIT 1',[req.params.id], function (err, results) {if(err) return next(err);if(!results[0]) return res.send(404);fn(results[0]);});}function getReviews (item_id, fn) {db.query('SELECT text, stars FROM review WHERE item_id= ?',[item_id], function (err, results) {if(err) return next(err);fn(results);});}getItem(function (item) {getReviews(item.id, function (reviews) {res.render('item', {item: item, reviews: reviews});});});
    });
    //评价商品的路由
    app.post('/item/:id/review', function(req, res, next) {db.query('INSERT INTO review SET item_id = ?, stars = ?, text = ?',[req.params.id, req.body.stars, req.body.text], function(err, info) {if (err) return next(err);console.log('-review created with id %s', info.insertId);res.redirect('/item/' + req.params.id);});
    });app.listen(3000, function() {console.log(' - listeing on http://*:3000');
    });

  • views/layout.jade:
    doctype 5
    htmlheadtitle My shopping cartbodyh1 My shopping cart#cartblock body

  • views/index.jade:
    extends layout
    block bodyh2 All itemsif(items.length)uleach item in itemslih3: a(href='/item/#{item.id}')=item.title=item.descriptionelsep No items to showh2 Create new itemform(action='/create', method='post')plabel Titleinput(type='text', name='title')plabel Descriptiontextarea(name='description')pbutton Submit

  • views/item.jade:
    extends layout
    block bodya(href='/') Go backh2= item.titlep= item.descriptionh3 User reviewsif(reviews.length)each review in reviews.reviewb #{review.stars} starsp= review.texthrelsep No reviews to show. Write one!form(action='/item/#{item.id}/review', method='POST')fieldsetlegend Create reviewplabel Starsselect(name='stars')option 1option 2option 3option 4option 5plabel Reviewtextarea(name='text')pbutton(type='submit') Send

sequelize:

上面例子的问题:建表的过程是手动的;表的定义不是项目一部分(单独的setup.js),应用程序无法进行校验;

sequelize通过定义schema和模型同时使用同步特性来创建数据库表(不需要单独建立);

  • 连接sequelzie:

    var Sequelize = require('sequelize');
    var sequelize = new Sequelize('todo-example', 'root');

Sequelize构造器接受参数包括:

  • database(String)
  • username(String) //必要
  • password(String) //可选
  • other option(Object) //可选
  • host(String)
  • port(Number)
  • 定义模型和同步:使用sequelize.define方法,第一参数为模型名,第二参数是包含了属性的对象;

    var Project = sequelize.define('Project', {title : Sequelize.STRING,description: Sequelize.TEXT,created: Sequelize.DATE
    });
    

    对应的MySql类型:

    • Sequelize.STRING             //VARCHAR(255)
    • Sequelize.BOOLEAN          //TINYINT(1)
    • Sequelize.TEXT                //TEXT
    • Sequelize.DATE               //DATETIME
    • Sequelize.INTEGER          //INT

此外还可以传递选项对象: title: {type: Sequelize.STRING, default: 'title'}

  • 例子://注意要先建好数据库 建立数据库
  • server.js
    var express = require('express');
    var Sequelize = require('sequelize');app = express.createServer();//注意格式
    app.use(express.static(__dirname + '/public'));
    app.use(express.bodyParser());app.set('view engine', 'jade');
    app.set('views','views');
    app.set('view option', {layout: false});//首页路由
    app.get('/', function (req, res, next) {Project.findAll().success( function (projects) {res.render('index', {projects: projects});}).error(next);
    });
    //删除项目路由
    app.del('/project/:id', function (req, res, next) {Project.find(Number(req.params.id)).success(function (proj) {proj.destroy().success(function () {res.rend(200);}).error(next);}).error(next);
    });
    //创建项目路由
    app.post('/projects', function (req, res, next) {Project.build(req.body).save().success(function (obj) {res.send(obj);}).error(next);
    });
    //展示指定项目路由
    app.get('/project/:id/tasks', function (req, res, next) {Project.find(Number(req.params.id)).success(function (project) {project.getTasks().on('success', function (tasks) {res.render('tasks', {project: project, tasks: tasks});})}).error(next);});
    //为指定项目添加任务
    app.post('/project/:id/tasks', function (req, res, next) {res.body.ProjectId = req.params.id;Task.build(req.body).save().success(function (obj) {res.send(obj);}).error(next);
    });
    //删除任务路由
    app.del('/task/:id', function (req, res, next) {Task.find(Number(req.params.id)).success(function (task) {task.destroy().success(function () {res.send(200);}).error(err);}).error(next);
    });app.listen(3000, function() {console.log(' - listening on http://*3000');
    });//初始化,处于对结构清晰的考虑,在应用设置后做;
    var sequelize = new Sequelize('todo-example', 'root','123');//定义任务模型
    var Project = sequelize.define('Project', {title: Sequelize.STRING,description: Sequelize.TEXT,created: Sequelize.DATE
    })var Task = sequelize.define('Task', {title: Sequelize.STRING
    });//设置联合
    Task.belongsTo(Project);
    Project.hasMany(Task);//同步
    sequelize.sync();

  • views/layout.jade
    doctype 5
    htmlheadtitle TODO list appscript(src='/lib/jquery.min.js')script(src='/main.js')bodyh1 TODO list app#todoblock body

  • views/index.jade
    extends layout
    block bodyh2 All itemsif(items.length)uleach item in itemslih3: a(href='/item/#{item.id}')=item.title=item.descriptionelsep No items to showh2 Create new itemform(action='/create', method='post')plabel Titleinput(type='text', name='title')plabel Descriptiontextarea(name='description')pbutton Submit

  • views/tasks.jade
    h2 Tasks for project #{project.title}#listul#tasks-listeach task in taskslispan= task.titlea.delete(href='/task/#{task.id}') Xform#add(action='/project/#{project.id}/tasks', method='POST')input(type= 'text', name= 'title')button Add

  • public.main.js
    $(function () {$('form').submit( function (ev) {ev.preventDefault();var form = $(this);$.ajax({url: form.attr('action'),type: 'POST',data: form.serialize(),success: function (obj) {var el = $('<li>');if ($('#projects-list').length) {el.append($('<a>').attr('href', '/project/' + obj.id + '/tasks').text(obj.title + ' ')).append($('<a>').attr('href', '/project/' + obj.id).attr('class', 'delete').text('x'));}$('ul').append(el);}});form.find('input').val(''); //clear input$('ul').delegate('a.delete', 'click', function (ev) {ev.preventDefault();var li = $(this).closest('li');$.ajac({url: $(this).attr('href'),type: 'DELETE',SUCCESS: function () {li.remove();}})})});});

转载于:https://www.cnblogs.com/jinkspeng/p/4130740.html

node连接--MySQL相关推荐

  1. node连接mysql,刚开始运行一切正常,后来连接失败报错。

    之前写了个小程序Node News,用到了MySQL数据库,在本地测试均没神马问题.放上服务器运行一段时间后,偶然发现打开页面的时候页面一直处于等待状态,直到Nginx返回超时错误.于是上服务器检查了 ...

  2. Node连接MySQL数据库进行基本的增删改查操作(一看就会)

    Node连接MySQL数据库进行基本的增删改查操作(一看就会) ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ...

  3. Node连接MySQL并封装其增删查改

    Node连接Mysql 说到node,可能大家会想到MOngoDB作为数据库,这里将会介绍node与mysql的连接,并分享了封装好的实例代码,在项目开发中可直接使用.下一篇博客将会讲node连接Mo ...

  4. node 连接MySQL

    使用node创建一个服务端比java简单多,下面创建一个node服务端,连接MySQL并且将数据在浏览器显示出来 一. node创建服务端案例 var http = require("htt ...

  5. node --- 使用node连接mysql

    1.确保下载了mysql,且mysql处于打开状态. 2.确保下载了node,并成功安装:https://nodejs.org/en/ (小黑窗 node -v 查看) 3.安装node操作mysql ...

  6. Node 连接Mysql并进行增删改查

    NPM: NPM的全称是Node Package Manager,类似于ruby的gem,Python的PyPL.setuptools,PHP的pear,是Nodejs中的包管理器.Nodejs自身提 ...

  7. Node 连接mysql数据库

    JXcore作者已经不维护了. github地址 https://github.com/jxcore/jxcore 所以下面是Node.js连接Mysql Node.js 连接Mysql 使用的内容作 ...

  8. 微信小程序通过 node 连接 mysql——方法,简要原理,及一些常见问题

    前言 博主自己在22年夏天根据课程要求做了一个小程序连接阿里云服务器的案例,在最近又碰到了相应的需求. 原参考文章:微信小程序 Node连接本地MYSQL_微信小程序nodejs连接数据库_JJJen ...

  9. node --- 连接mysql(docker环境) Sequelize库

    mysql 数据库 [1] 首先配置 docker 环境 采用 docker-compose 方法 源码: /test-mysql/docker-compose.yml version: '3.1' ...

  10. node连接MySQL的三种方式

    以下我们将说明node连接数据库的三种方式,并进行利弊说明,以挑选出最适合项目的连接方式. 1.使用mysql包的提供的接口进行连接 例如: connection.query('SELECT * FR ...

最新文章

  1. java基础国庆作业_java程序设计国庆作业
  2. reactjs基础知识:原生事件绑定
  3. mysql where 拼接_分一个mysql拼接where语句的Directive,并请教一个问题
  4. js input 自动换行_矿用自动灭火装置水基型自动灭火装置原理国内分析研讨_搜狐汽车...
  5. JSF 2.2在30秒内创建一个自定义Hello World组件
  6. onpagefinished等了很久才执行_今天自律了吗?停课不停锻炼 才是战疫正确姿势
  7. 前端学习(2968):完善登录页面
  8. java 自定义注解 生成json_Java中如何创建自定义的注解
  9. python包requests使用笔记
  10. Centos 下配置JAVA环境
  11. RTU设备功能及选型
  12. php 怎么使用sql server 2000,Linux下PHP支持MSSQL(SQL Server2000)
  13. 机器学习--SVM支持向量机
  14. mysql对结果再查询_SQL如何在查询结果里再次查询?
  15. 容器安全技术容器发展历程
  16. RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is
  17. qemu图形界面linux,QEMU 简单几步搭建一个虚拟的ARM开发板
  18. Linux keypad 设备树,matrix_keypad 矩阵按键驱动分析
  19. <C语言>如何使用C语言代码打印“心形”图案?
  20. PyCharm运行按钮是灰色的

热门文章

  1. 如何得到当前浏览器是什么
  2. 我的k8s随笔:Kubernetes部署的一些输出信息
  3. FTP学习的一些笔记
  4. Oracle 索引相关
  5. 【Flink】Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务
  6. 【clickhouse】clickhouse UTC 时间带有时区 如何写入
  7. 【Elasticsearch】倒排索引原理
  8. 【Spark】Spark cache 报错 Exception thrown in awaitResult
  9. 【Clickhouse】Clickhouse MergeTree家族引擎
  10. 95-134-110-源码-维表-Flink 1.9.0 维表实现