为了模拟项目上线,咱们就须要一个服务器去提供API给咱们调用数据。此次我采用express框架去写API接口。全部请求都是经过ajax请求去请求服务器来返回数据。第一次用node写后端,基本就是摸着石头的过河,文中有什么不足不处欢迎指出。html
传送门: express官方前端
而后介绍一下须要引入的中间件,node自己提供了一些库。咱们能够直接经过require去引用,对于未提供的库,咱们也能够经过手动npm去安装node
var fs = require('fs'); 操做文件模块 var http = require('http'); http模块 var url = require('url'); 获取url信息模块 var qs = require('querystring'); 处理url参数模块 var path = require('path'); 文件路径模块 var bodyParser = require('body-parser'); 请求体对象化 (必须)不然后台没法解析前端发送的body内容
接下来直接启用模块git
app.use(bodyParser.json()); // 访问静态资源文件 这里是访问全部dist目录下的静态资源文件 app.use(express.static(path.resolve(__dirname, '../dist'))) app.use(express.static('public')); // 由于是单页应用 全部请求都走/dist/index.html app.get('/', function(req, res) { const html = fs.readFile(path.resolve(__dirname, '../dist/index.html'), 'utf-8'); res.send(html) }); //处理请求跨域 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Content-Type", "application/json;charset=utf-8"); res.header("Access-Control-Allow-Headers", "content-type"); next(); });
准备工做作完能够开始动手写接口了。关于数据库能够模拟一个json,也能够真实模拟上线数据库。关于本文设计的mongodb数据库,有兴趣能够看个人另外一篇文章
。github
下面会划成3块说明——数据库的对接、请求的操做、文件请求的操做。mongodb
这里我假设你已经安装了mongodb数据库并成功启用。仔细阅读express教程你会发现框架提供了对mongodb的支持,mongodb有很是多的扩展插件去使用该数据库 好比mongoose。这里咱们使用express官方提供的mongoskin来连接数据库。数据库
$ npm install mongoskin #####官方实例 var db = require('mongoskin').db('localhost:27017/animals'); db.collection('mamals').find().toArray(function(err, result) { if (err) throw err; console.log(result); });
安装成功后 ,咱们就首先把使用的数据库引入,代码以下express
var db = require('mongoskin').db('mongodb://localhost:27017/blog'); var ObjectId = require('mongodb').ObjectID;
以上代码表示咱们成功链接了blog数据库而且启用了私有ID,objectID是mongodb生成数据自动添加的ID。能够直接拿来用。到这里数据库和服务器就已经对接完毕了。npm
/** * 获取文章信息 */ app.get('/article/info', function (req, res) { >>> 获取请求参数 var arg = qs.parse(url.parse(req.url).query); var id = arg.id; >>> 连接数据库根据参数查找文档并返回 db.collection('articleList').find({ "_id": ObjectId(id)}).toArray(function(err, result) { if (err) throw err; console.log(result) res.end(JSON.stringify(result)) }); });
以上代码就实现了对一个get请求的处理,经过参数模块获取了url的参数,db也就是已经链接的数据库。根据ID对‘articleList’的数据表进行搜索,处理完毕后 经过res.end()返回数据结束响应。
/** * 提交留言信息 */ app.post('/board/post', function (req, res) { >>>> 获取请求参数 var data = { date: req.body.date, name: req.body.name, content: req.body.content, time: req.body.time, position: req.body.position }; >>> 连接数据库并插入数据 db.collection('board').insert(data, function(err, result) { if(err) { res.end('Error:'+ err) } res.end('提交成功') }); });
post请求的参数获取和get不一样 能够直接经过req.body去获取前端传输的请求体。经过js对象的方式去获取参数。而后根据参数执行数据库操做。到此,基本的请求也就介绍完毕了。下面说下怎么处理图片的上传此类常见的文件操做需求。
为了简化操做,咱们能够引入multer模块来处理文件,代码以下
var multer = require('multer'); var storage = multer.diskStorage({ //设置上传后文件路径,uploads文件夹会自动建立。 destination: function (req, file, cb) { cb(null, './public/uploads') }, //给上传文件重命名,获取添加后缀名 filename: function (req, file, cb) { var fileFormat = (file.originalname).split("."); cb(null, file.fieldname + '-' + Date.now() + "." + fileFormat[fileFormat.length - 1]); } }); //生成上传模块,让API调用 var upload = multer({ storage: storage }).single('file');
以上代码就成功引入了文件上传模块,经过该模块咱们能够快速生成相应内容,具体使用方法能够查看官方文档。准备工做完成后,在项目中使用:
/** * 图片上传 */ app.post('/upload', function (req, res) { upload(req, res, function (err) { if (err) { console.log(err) return } console.log(req.file) res.end(JSON.stringify(req.file)) }) }); //图片上传到服务器 ,向客户端返回文件信息 好比文件的存储位置,以后就能够经过地址访问服务器的图片 /** * 图片删除 */ app.post('/image/delete', function (req, res) { fs.unlink(req.body.path, function(err) { if (err) { return console.error(err); } res.end("文件删除成功!"); }); });
这里上传图片咱们就直接使用了直接以前已经写好的upload模块,当该接口请求成功时 ,文件就已经上传成功了,若是你须要一个预览过程,那不该该直接调用上传接口 。经过原生node fs模块 咱们也能对添加的文件进行删除,修改操做。
上线过程咱们能够看成就是换一台电脑跑程序,这里我用的是阿里云的服务器。在云服务器安装好环境好,把项目克隆进去 ,再装个forever之类的永久运行库,start ~ok 这样你的项目就永远在运行了。若是须要www访问 ,还须要买个dns解析 和域名,指向你的服务器。
以上咱们若是在本地跑项目基本已经能够没问题。但项目上线后一刷新。啊啦??404什么鬼?打开百度一查。那炉火多~~当前端启用hisory模式,后台也必须开启对history的支持。express 环境以下:
var history = require('connect-history-api-fallback'); var connect = require('connect'); /////// app.use(history());
更新代码刷新~OK 完美!
想学好同样东西,须要长久的积累。做为一个前端,一些服务器数据库的知识除了能够帮助咱们更好的跟兄弟(后端)交流,对前端来讲也是如鱼得水通常的存在。
下一篇文章准备写electron入门,electron是经过js构建桌面应用的框架,。共勉~~~~~
所有源码都在个人博客之中,对个人博客源码有兴趣,能够fork一份自行研究
若是以为本文对你有所帮助,就star一下吧~大传送之术! 个人博客Github