接着上一篇的php+mysql,我们来试一试nodejs怎么实现数据的增删查改。
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。我们需要的很多工具都可以直接用npm下载安装,比如前端工业化框架gulp,grunt,fis等,还有css的预处理语言less,都可以在cmd使用npm安装使用。这个以后专开一篇博客介绍。
回到nodejs,首先怎么安装,我们直接在nodejs的官网或者中文网下载一个稳定版本的安装包就行了,需要注意的是最好安装在默认目录,不然windows系统需要修改环境变量,mac没有用过,请自行百度。
安装完成以后在桌面新建一个文件夹,进入:
C:UsersAdmin>cd Desktop C:UsersAdminDesktop>mkdir nodejstest C:UsersAdminDesktop>cd nodejstest
在这个目录下使用exoress快速创建一个框架,本次我们只需要安装ejs,如果需要模板引擎的话,可以根据需要安装,具体命令参见http://www.expressjs.com.cn/starter/generator.html。
然后使用npm install执行安装。
C:UsersAdminDesktop odejstest>express -e
C:UsersAdminDesktop odejstest>npm install
这时候刚刚创建的文件夹下面就生成了一些文件,我们把我们的html,css等文件替换到public中。
执行一下:
C:UsersAdminDesktop odejstest>npm start
然后在浏览器中访问http://localhost:3000/ 就可以看到默认的index.html,或者在他后面加上我们想访问的html。
这个时候数据库并没有连接,我们可以看到页面报错。
执行下面的命令把数据库安装到当前的工程:
C:UsersAdminDesktop odejstest>npm install mysql --save-dev
想要了解更多可以去npm的官网搜索一下mysql,里面会有详细的讲解。
安装完成后就可以使用他来连接之前的数据库了,打开xampp,开启Mysql。
下面修改代码:
把刚才的文件夹拖到编辑器,先看一下生成的app.js:
我们可以看到他建立了两个路由:
var routes = require('./routes/index'); var users = require('./routes/users');
一个作为用户端,一个作为服务端。
还建立了两个请求:
app.use('/', index);
app.use('/users', users);
我们修改一下:
app.use('/news', routes);
app.use('/admin', users);
这两句表示,监听3000端口,当获取到发往news的请求时,就进入到routes/index.js中。当获取到发往admin的请求时,就进入到routes/users.js中。
在我们之前的js文件中,将ajax的url修改掉,比如:
//获取 $.ajax({ url: "/news", type: "get", datatype: "json", data:{"newstype":newsType}, success: function(data) { ... }, error: function(){ console.log('error'); } }); //增加 $.ajax({ url: "/admin/insert", type: "post", data: jsonNews, datatype: "json", success: function(data) { ... }, error: function(XHR, textStatus, errorThrown) { console.log(textStatus + "ready:" + XHR.readyState); } }); //删除 $.ajax({ url: "/admin/delete", type: "post", data: { "newsid": deleteId }, success: function() { ... }, error:function(xhr,status){ console.log(status); } }); //修改获取和提交: $.ajax({ url: "/admin/curnews", type: "get", datatype: "json", data: { "newsid": updateId }, success: function(data) { ... } }); $.ajax({ url: "/admin/update", type: "post", data: { "newstitle": $("#unewsTitle").val(), "newstype": $("#unewsType").val(), "newsimg": $("#unewsImg").val(), "newstime": $("#unewsTime").val(), "newssrc": $("#unewsSrc").val(), "id": updateId }, success: function(data) { ... } });
其他内容不变,不再赘述,参见上一篇博客 http://www.cnblogs.com/weirihan/p/6137741.html。
接下来就是服务器函数,我们在routes下面的js文件中写对应的函数替代之前用php写的server。
仍旧可以创建一个db.js来连接数据库:
var mysql = require('mysql'); var connection = mysql.createPool({ host: 'localhost', port: 3306, user: 'name', password: 'pwd', database: 'testabc' }); connection.getConnection(function(err,connection){ if(err){ console.log("connection false"); } }); exports.connection=connection;
在index.js中,获取数据:
var express = require('express'); var router = express.Router(); var db = require('./db.js'); /* 在主页获取数据时的请求. */ router.get('/', function(req, res, next) { var newstype = req.query.newstype; db.connection.query('SELECT * FROM `news` WHERE `newstype` = ?',[newstype],function(err,rows,fields){ res.json(rows); }) }); module.exports = router;
在user.js中:
增加(这里加了一个重复校验):
/*insert*/ router.post('/insert', function(req, res) { var newstime = req.body.newstime, newstype = req.body.newstype, newstitle = req.body.newstitle, newsimg = req.body.newsimg, newssrc = req.body.newssrc; var thistitle = null; var count = 0; /*获取与新增的title一样的数据数目:*/ db.connection.query('select count(0) as count from news where newstitle=?', [newstitle], function(err, rows) { rows.forEach(function(e) { count = e.count; //console.log("##count = " + count); }); /*有重复:*/ if (count > 0) { res.json({ "success": "alreadyhad" }); } else { db.connection.query('INSERT INTO `news` (`newstitle`,`newstype`,`newsimg`,`newstime`,`newssrc`) VALUES (?,?,?,?,?)', [newstitle, newstype, newsimg, newstime, newssrc], function(err, result) { if (!err) { //console.log(result.insertId); res.json({ "delete": "success" }); } else { res.json({ "delete": "fail" }); } }); } }); });
修改:
/*模态框取值*/ router.get('/curnews', function(req, res) { var newsid = req.query.newsid; db.connection.query('SELECT *FROM `news` WHERE id=?', [newsid], function(err, rows) { res.json(rows); }) }); /*确认更新*/ router.post('/update', function(req, res) { var newsid = req.body.id, newstype = req.body.newstype, newstitle = req.body.newstitle, newsimg = req.body.newsimg, newstime = req.body.newstime, newssrc = req.body.newssrc; var thistitle = null; var count = 0; db.connection.query('SELECT *FROM `news` WHERE id=?', [newsid], function(err, rows) { rows.forEach(function(e) { thistitle = e.newstitle; //console.log("##thistitle = " + thistitle); }); /*获取与修改的title一样的数据数:*/ db.connection.query('select count(0) as count from news where newstitle=?', [newstitle], function(err, rows) { rows.forEach(function(e) { count = e.count; //console.log("##count = " + count); }); /*有重复且不是本身:*/ if ((count > 0) && (newstitle != thistitle)) { res.json({ "success": "alreadyhad" }); } else { db.connection.query('UPDATE `news` SET `newstitle`=?,`newstype`=?,`newsimg`=?,`newstime`=?,`newssrc`=? WHERE `id`=?', [newstitle, newstype, newsimg, newstime, newssrc, newsid], function(err, rows) { if (err) { res.json({ "update": "fail" }); }else{ res.json({ "update": "success" }); } }); } }); }); });
删除:
/*delete*/ router.post('/delete', function(req, res) { var newsid = req.body.newsid; db.connection.query('DELETE FROM `news` WHERE `news`.`id`=?', [newsid], function(err, result) { //console.log(result.affecteRows); if (!err) { res.json({ "delete": "success" }); } else { res.json({ "delete": "fail" }); } }); });
以上就是nodejs+mysql实现数据库增删查改。
endding~