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来创建商品的id
console.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
html
head
title My shopping cart
body
h1 My shopping cart
#cart
block body - views/index.jade:
extends layout
block body
h2 All items
if(items.length)
ul
each item in items
li
h3: a(href='/item/#{item.id}')=item.title
=item.description
else
p No items to show
h2 Create new item form(action='/create', method='post')
p
label Title
input(type='text', name='title')
p
label Description
textarea(name='description')
p
button Submit - views/item.jade:
extends layout
block body
a(href='/') Go back
h2= item.title
p= item.description
h3 User reviews
if(reviews.length)
each review in reviews
.review
b #{review.stars} stars
p= review.text
hr
else
p No reviews to show. Write one! form(action='/item/#{item.id}/review', method='POST')
fieldset
legend Create review
p
label Stars
select(name='stars')
option 1
option 2
option 3
option 4
option 5
p
label Review
textarea(name='text')
p
button(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
html
head
title TODO list app
script(src='/lib/jquery.min.js')
script(src='/main.js')
body
h1 TODO list app
#todo
block body - views/index.jade
extends layout
block body
h2 All items
if(items.length)
ul
each item in items
li
h3: a(href='/item/#{item.id}')=item.title
=item.description
else
p No items to show
h2 Create new item form(action='/create', method='post')
p
label Title
input(type='text', name='title')
p
label Description
textarea(name='description')
p
button Submit - views/tasks.jade
h2 Tasks for project #{project.title} #list
ul#tasks-list
each task in tasks
li
span= task.title
a.delete(href='/task/#{task.id}') X form#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();
}
})
})
}); });
node连接--MySQL的更多相关文章
- Node 连接Mysql并进行增删改查
NPM: NPM的全称是Node Package Manager,类似于ruby的gem,Python的PyPL.setuptools,PHP的pear,是Nodejs中的包管理器.Nodejs自身提 ...
- node连接mysql数据库
1. 创建项目,安装mysql 创建项目文件夹test, 在test文件夹下yarn add mysql --save安装mysql: 2. node使用mysql 在test文件夹下,创建test. ...
- node连接Mysql报错ER_NOT_SUPPORTED_AUTH_MODE
报错信息 本人系统安装的是mysql-installer-community-8.0.18.0.msi这个版本,然后我本地使用node-mysql去连接数据库. test.js文件 var mysql ...
- node 连接MySQL及其分装, 连接池连接
const mysql = require('mysql') const config = require('./../../config/config.default') var connectio ...
- node 连接 mysql 数据库三种方法------笔记
一.mysql库 文档:https://github.com/mysqljs/mysql mysql有三种创建连接方式 1.createConnection 使用时需要对连接的创建.断开进行管理 2. ...
- Node连接MySQL
http://blog.fens.me/nodejs-mysql-intro/ http://czpae86.iteye.com/blog/1636302 http://www.cnblogs.com ...
- Node.js Express连接mysql完整的登陆注册系统(windows)
windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...
- Node.js连接Mysql,并把连接集成进Express中间件中
引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...
- paip.最好的脚本语言node js 环境搭建连接mysql
paip.最好的脚本语言node js 环境搭建连接mysql #====下载node...走十一个exe..容易的.. 1 #0----Hello world .js 2 #---------模 ...
随机推荐
- 《深入PHP与jQuery开发》读书笔记——Chapter3
<深入PHP与jQuery开发>第三章学习笔记 1.PHP的魔术方法(在对象中发生某些例行事件时会自动调用这些方法) PHP提供了魔术方法__construct()(构造函数),在新对象被 ...
- 草根玩微博 中产玩微信 土豪玩什么?支持Yo的iWatch?
<中国新媒体发展报告(2014)>发布了一些新媒体的使用情况数据,25.6%无收入群体人数在玩微博,32.0%的微信用户属于月收入3000~5000元的中产阶层,那么土豪会玩什么新媒体呢? ...
- Arbitrage(bellman_ford)
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16652 Accepted: 7004 Descri ...
- tolua.cast的实用方法
local name = (tolua.cast(sender, "ccui.Button")):getTitleText()
- IIS网站发布部署
Windows—控制面板——程序和功能——打开或关闭Windows功能——Internet信息服务(IIS),一定要选中ASP.Net. 1.打开你的VS2012网站项目,右键点击项目>菜单中 ...
- CPU供电维修
- 使用twisted.web实现代理服务器
简单的实现谷歌的代理: 架构就是下面这么简单. ================= my server outside GFW | <----------------------> ...
- linux下proc里关于磁盘性能的参数
我 们在磁盘写操作持续繁忙的服务器上曾经碰到一个特殊的性能问题.每隔 30 秒,服务器就会遇到磁盘写活动高峰,导致请求处理延迟非常大(超过3秒).后来上网查了一下资料,通过调整内核参数,将写活动的高峰 ...
- AWS AutoScaling
origin_from: http://blog.csdn.net/libing_thinking/article/details/48327189 AutoScaling 是 AWS 比较核心的一个 ...
- excel复制+粘贴,怎样让公式里的参数不自动变化?
例如,某一单元格内容为:=A1+A2 我把它复制+粘贴到其他地方,就自动变成了:=B1+B2 怎样让它不变化,仍保持=A1+A2 ?? 答: Excel一般使用相对地址来引用单元格的位置,当把一个含有 ...