node连接--MySQL
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相关推荐
- node连接mysql,刚开始运行一切正常,后来连接失败报错。
之前写了个小程序Node News,用到了MySQL数据库,在本地测试均没神马问题.放上服务器运行一段时间后,偶然发现打开页面的时候页面一直处于等待状态,直到Nginx返回超时错误.于是上服务器检查了 ...
- Node连接MySQL数据库进行基本的增删改查操作(一看就会)
Node连接MySQL数据库进行基本的增删改查操作(一看就会) ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ...
- Node连接MySQL并封装其增删查改
Node连接Mysql 说到node,可能大家会想到MOngoDB作为数据库,这里将会介绍node与mysql的连接,并分享了封装好的实例代码,在项目开发中可直接使用.下一篇博客将会讲node连接Mo ...
- node 连接MySQL
使用node创建一个服务端比java简单多,下面创建一个node服务端,连接MySQL并且将数据在浏览器显示出来 一. node创建服务端案例 var http = require("htt ...
- node --- 使用node连接mysql
1.确保下载了mysql,且mysql处于打开状态. 2.确保下载了node,并成功安装:https://nodejs.org/en/ (小黑窗 node -v 查看) 3.安装node操作mysql ...
- Node 连接Mysql并进行增删改查
NPM: NPM的全称是Node Package Manager,类似于ruby的gem,Python的PyPL.setuptools,PHP的pear,是Nodejs中的包管理器.Nodejs自身提 ...
- Node 连接mysql数据库
JXcore作者已经不维护了. github地址 https://github.com/jxcore/jxcore 所以下面是Node.js连接Mysql Node.js 连接Mysql 使用的内容作 ...
- 微信小程序通过 node 连接 mysql——方法,简要原理,及一些常见问题
前言 博主自己在22年夏天根据课程要求做了一个小程序连接阿里云服务器的案例,在最近又碰到了相应的需求. 原参考文章:微信小程序 Node连接本地MYSQL_微信小程序nodejs连接数据库_JJJen ...
- node --- 连接mysql(docker环境) Sequelize库
mysql 数据库 [1] 首先配置 docker 环境 采用 docker-compose 方法 源码: /test-mysql/docker-compose.yml version: '3.1' ...
- node连接MySQL的三种方式
以下我们将说明node连接数据库的三种方式,并进行利弊说明,以挑选出最适合项目的连接方式. 1.使用mysql包的提供的接口进行连接 例如: connection.query('SELECT * FR ...
最新文章
- java基础国庆作业_java程序设计国庆作业
- reactjs基础知识:原生事件绑定
- mysql where 拼接_分一个mysql拼接where语句的Directive,并请教一个问题
- js input 自动换行_矿用自动灭火装置水基型自动灭火装置原理国内分析研讨_搜狐汽车...
- JSF 2.2在30秒内创建一个自定义Hello World组件
- onpagefinished等了很久才执行_今天自律了吗?停课不停锻炼 才是战疫正确姿势
- 前端学习(2968):完善登录页面
- java 自定义注解 生成json_Java中如何创建自定义的注解
- python包requests使用笔记
- Centos 下配置JAVA环境
- RTU设备功能及选型
- php 怎么使用sql server 2000,Linux下PHP支持MSSQL(SQL Server2000)
- 机器学习--SVM支持向量机
- mysql对结果再查询_SQL如何在查询结果里再次查询?
- 容器安全技术容器发展历程
- RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is
- qemu图形界面linux,QEMU 简单几步搭建一个虚拟的ARM开发板
- Linux keypad 设备树,matrix_keypad 矩阵按键驱动分析
- <C语言>如何使用C语言代码打印“心形”图案?
- PyCharm运行按钮是灰色的
热门文章
- 如何得到当前浏览器是什么
- 我的k8s随笔:Kubernetes部署的一些输出信息
- FTP学习的一些笔记
- Oracle 索引相关
- 【Flink】Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务
- 【clickhouse】clickhouse UTC 时间带有时区 如何写入
- 【Elasticsearch】倒排索引原理
- 【Spark】Spark cache 报错 Exception thrown in awaitResult
- 【Clickhouse】Clickhouse MergeTree家族引擎
- 95-134-110-源码-维表-Flink 1.9.0 维表实现