最近在学习node.js,做了一个动手项目,使用node.js+express框架,配合mysql数据库和前端vue框架开发多人文档编辑系统。以node.js环境下的express+mysqlserver项目为例首先环境搭建:$npminstall-gexpress-generator$node环境下的express-eproject进入项目文件根目录,安装依赖模块$npminstall$DEBUG=node-blog:*npmstarttoseewhatisintheprojectdirectory查看生成的项目目录下有什么bin:存放可执行文件node_modules:存放package.json中安装的模块,添加依赖的时候modulesinpackage.json并且安装好之后存放在这个文件夹下public:存放image,css,js等前端资源文件routes:存放路由文件views:存放视图文件或者模板文件app.js:启动文件,或者入口文件package.json:存放项目信息和模块依赖。当在dependencies中添加依赖模块时,运行npminstall,npm会检查当前目录下的package.json,并自动安装所有指定的模块。接下来,开始安装数据库。这里我选择的是mysql。npminstallmysql--save-dev安装完成后开始配置数据库。//mysql配置文件mysql={host:"xx.xxx.xx.xxx",//这是数据库的地址user:"xxx",//需要用户名password:"xxx",//userpassword,如果没有密码,直接双引号就是database:"xxx"//数据库名}//好了,这样我们就可以连接数据库了module.exports=mysql;//使用module.exports暴露这个接口,mysql连接池配置://mysql连接池配置文件varmysql=require('mysql');var$dbConfig=require('../config/mysql');//注意自己项目中mysql配置文件的路径//使用连接池,避免线程过多,提高性能varpool=mysql.createPool($dbConfig);/***自定义返回JSON结果进行查询执行结果*/functionresponseDoReturn(res,result,resultJSON){if(typeofresult==='undefined'){res.json({code:'201',msg:'failedtodo'});}else{res.json(结果);}};/***封装查询的sql,不带占位符func*/functionquery(sql,callback){pool.getConnection(function(err,connection){connection.query(sql,function(err,rows){callback(err,rows));//释放链接connection.release();});});}/***封装查询的sqlBitfunc*/functionqueryArgs(sql,args,callback){pool.getConnection(function(err,connection){connection.query(sql,args,function(err,rows){callback(err,rows);//释放linkconnection.release();});});}//exportsmodule.exports={query:query,queryArgs:queryArgs,doReturn:responseDoReturn}操作数据库的过程比较灵活,我用的思路模块化,将一张数据表封装成一个模块暴露出来,通过模块可以得到对这张表进行增删改查的SQL语句下面贴上示例代码:letexpress=require('express');letmysql=require('../common/basicConnection');letqibu_task={index:'',value:'',list:`SELECT*fromqibu_task;`,//列表查询insert(args){qibu_task.index='';qibu_task.value='';args=filter(['id','task','name','created_at'],args)for(letkeyinargs){qibu_task.index=`${qibu_task.index}${key},`让re=/^[0-9]+.?[0-9]*/;if(re.test(args[key])){qibu_task.value=`${qibu_task.value}${args[key]},`}else{qibu_task.value=`${qibu_task.value}'${args[key]}',`}}qibu_task.index=qibu_task.index.substr(0,qibu_task.index.length-1);qibu_task.value=qibu_task.value.substr(0,qibu_task.value.length-1);return`INSERTINTOqibu_task(${qibu_task.index})VALUES(${qibu_task.value})`;},//按需增加select(index,value){return`SELECT*fromqibu_taskwhere${index}=${value};`//按需查询},delete(index,value){return`DELETEfromqibu_taskwhere${index}=${value};`//按需删除},update(index,args){//提交修改if(indexinargs){qibu_task.value='';args=filter(['id','task','name','created_at'],args)for(letkeyinargs){letre=/^[0-9]+.?[0-9]*/;if(re.test(args[key])){qibu_task.value=`${qibu_task.value}${key}=${args[key]},`}else{qibu_task.value=`${qibu_task.value}${key}='${args[key]}',`}}qibu_task.value=qibu_task.value.substr(0,qibu_task.value.length-1)return`UPDATEqibu_taskSET${qibu_task.value}WHERE${index}=${args[index]};`}},};//参过滤函数filter(arguments,obj){letnewObj={}arguments.forEach(every=>{if(everyinobj){newObj[every]=obj[every]}});returnnewObj;};module.exports=qibu_task;然后就可以在路由返回的时候进行数据库操作了。具体代码就不贴了。路由可以识别get和post方法,通过传递参数模拟进行修改和删除。
