为什么不学习额外的语言特性就选择node;扩展网络和数据库的知识;一个字,快!安装环境快捷,一键无脑安装,无需为各种繁琐的配置而烦恼;服务启动迅速,只需几行代码即可生成web服务器;上手速度更快。思路是通过以下步骤对使用node开发web服务有一个大概的了解。安装数据库,这里我们选择mongodb;定义数据模型,即数据的结构和行为;定义数据模型,通过模型操作数据库;定义路由,当路由路径被访问时,触发相应的函数进行数据库操作。其实很简单,就三个步骤。通过一些代码层面的优化,我们甚至可以在实现第二步,定义好我们需要的数据结构后,生成一个restful风格的API。REST风格的API?宁静的数据接口?我勒个去?先说api,其实是一个很宽泛的命题。我们这里理解的api就是打通前后端交互的数据接口。并且具有一些语义,它可以是您封装的实用函数方法。在restful风格中,我们可以这样理解设计路径:在第2步和第3步定义数据结构后,通过路径访问数据资源。定义http动词:访问资源后,我们需要进行什么样的操作?熟悉的增删改查其实对应四个http动词post、delete、put、get。例如:get/api/user/=>查看/api/user路径下所有用户信息的资源尝试开发其实在开发web服务的时候,大部分的操作都是围绕着操作数据库进行的,必须有额外的操作数据库的学习成本。毕竟这是很多前端er都没有接触过的东西。个人认为,学习一个新的知识点,查阅官方文档无疑是最好的方式。假设已经安装了mongodb,我们还需要一个东西来操作数据库:mongoose,翻译过来就是猫鼬,是另一种不知名的鸟。这里可以很容易理解,可以用来更方便的操作数据库。其实官方的例子很好。跟着猫鼬在云端养猫。还记得之前的思路和步骤吗?首先,我们需要使用node的一个frameworkexpress生成一个项目模板设计路径:在routes文件夹下创建一个cat.js文件,这是我们要访问的资源;定义数据模型:定义数据结构,生成数据模型;定义路由:使用express框架的路由功能,根据http动词触发相应的功能来操作数据库;constexpress=require('快递');constrouter=express.Router();constmongoose=require("mongoose")//猫模式:假设每只猫都有名字和颜色的属性。constcatSchema=mongoose.Schema({name:String,color:String})//猫模型:通过传入猫模型,我们就有了一个模型,然后我们可以根据模型生成很多只猫!constCatModel=mongoose.model('Cat',catSchema)router.get('/cat',function(req,res,next){//后来猫越来越多,可以用模型找thekittenCatModel.find((err,allCats)=>res.json(allCats))});router.post('/cat',((req,res,next)=>{//假设我们要添加一只小猫,猫的信息通过post请求的请求体传递给服务器constcatInfo=req.body//如果请求体的内容是{name:'white',color:'black'}//根据猫的模型生成的小猫一只猫的属性是小白,颜色是黑色。constlititleCat=newCatModel(catInfo)//小猫调用保存方法后保存到数据库中lititleCat.save((err,saved)=>res.json(saved))}))router.delete('/cat',((req,res,next)=>{const{id}=req.body//根据传入猫的id删除猫的信息CatModel.findByIdAndRemove(id,(err,removed)=>res.json(removed))}))router.put('/cat',((req,res,next)=>{const{id}=req.body//根据传入的猫id更新猫信息CatModel.findByIdAndUpdate(id,{...req.body},{new:true},(err,updated)=>res.json(updated))}))这个时候服务没有生效,因为我们写了很多,但它没有被触发。我们需要在入口文件app.js中引入我们的路由文件。//引入猫的路由constcatRouter=require('./routes/cat');//app是我们的服务器,调用服务器资源路径/api时,会映射到我们猫的路由app.use('/api',catRouter);//localhoset:3000/api/cat是我们要请求cat资源的路径,最后使用http动词触发相应的数据库操作,我们就生成了第一个restful风格的api。高级假设我们要将猫的信息与其饲养者的信息绑定起来,我们需要链接表。mongoose的语法充满了各种回调,我们需要asyncawait来优化。接下来修改上面生成cat的例子constexpress=require('express');constrouter=express.Router();constmongoose=require("mongoose")constmongoose=require('mongoose')+constfeederSchema=mongoose.Schema({+feederName:String,+cat:{+type:mongoose.Schema.Types.ObjectId,//联表查询必须是这种格式来存储对应表的_id+ref:'Cat'//联表关系的表名,注意生成的模型Class,区别于模型名+}+})//猫模式:假设每只猫都有name和color的属性。constcatSchema=mongoose.Schema({name:String,color:String})+constfeederModel=mongoose.model("Feeder",feederSchema)//猫模型:通过传入猫模型,我们就有了模型,然后你可以根据这个模型生成很多猫!constCatModel=mongoose.model('Cat',catSchema)router.get('/cat',(req,res,next)=>{//后来猫越来越多了,可以用model来找到小猫CatModel.find((err,allCats)=>res.json(allCats))});router.post('/cat',async((req,res,next)=>{//假设我们想要添加一只小猫,猫的信息通过post请求的请求体传递给服务器。+const{name,color,feederName}=req.body//如果请求body内容为{name:'小白',color:'black',feederName:"张三"}+constcatInfo={name,color}//猫信息+constfeederInfo={feederName}//feeder信息//根据猫模型生成的小猫属性name为white,color为black。constlititleCat=newCatModel(catInfo)//小猫调用save方法后保存到数据库+const{_id}=awaitlititleCat.save()//将小猫的id关联到用户的cat+constnewFeeder=newfeederModel({...feederInfo,cat:_id})//保存用户信息+awaitnewFeeder.save()//可以通过populate()查询联邦表的属性,exec()可以更好的跟踪堆栈并让查询函数返回一个完整的promise对象+constdata=awaitfeederModel.find().populate("cat").exec()+res.json(data)}))router.delete('/cat',(req,res,next)=>{const{id}=req.body//根据传入猫的id删除猫的信息CatModel.findByIdAndRemove(id,(err,removed)=>res.json(removed))})router.put('/cat',(req,res,next)=>{const{id}=req.body//根据传入的猫id更新猫信息CatModel.findByIdAndUpdate(id,{...req.body},{new:true},(err,updated)=>res.json(updated))})你可以下载postman来测试代码优化你用postman多次测试代码后你会发现每次post请求都会添加重复的数据,即使内容没有变化,mongoose也会为保存的数据添加一个唯一的_id标识。按照正常逻辑,当没有这条数据时,插入一条新数据;当数据存在时,根据新的内容进行更新;判断数据是否存在,我们需要一个查询条件作为唯一标识,这样我们就可以使用findOneAndUpdate接口插入或更新我们的数据,修改post请求代码router.post('/cat',async((req,res,next)=>{//假设我们要添加一只小猫,猫的信息post请求的请求体传递给服务器const{name,color,feederName}=req.body//如果内容是requestbodyis{name:'小白',color:'black',feederName:"张三"}constcatInfo={name,color}//猫信息constfeederInfo={feederName}//feeder信息//这里是基于以猫的名字作为插入或更新的查询ID+const{_id}=awaitCatModel.findOneAndUpdate({name},catInfo,{upsert:true,new:true,setDefaultsOnInsert:true}).exec()//这里使用feeder的名称作为插入或更新的查询ID+awaitfeederModel.findOneAndUpdate({feederName},{...feederInfo,cat:_id},{upsert:true,new:true,setDefaultsOnInsert:true})//通过populate()可以查询联邦表的属性,exec()可以更好的跟踪堆栈,从而查询函数返回一个完整的promise对象constdata=awaitfeederModel.find().populate("cat").exec()res.json(data)}))总结当然,这些是node最基本的操作,但是这些很简单的东西却扩展了很多知识。通过断点调试,你可以对http请求通信、数据库模型操作等过程中的数据传输有更深入的了解,甚至会开始思考如何使用node做更多的事情。很多东西。例如:快速接口mock,协议制定后使用node开发数据接口,提高接口联调效率;甚至搭建可视化模拟数据平台,通过可编辑的表格操作生成数据界面;或者你可以新建一个自己的网站,用node搭建自己的服务器等等。最后贴上自己的github地址:https://github.com/kangjs7854...不要脸求个star,万分感谢~
