NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
~~~ //当前项目(包)的入口文件 //实现get方式添加新闻 //实现显示新闻详情页 //封装读取data.json文件的方法和写入data.json文件的方法 //1.加载http模块 var http = require('http'); var fs = require('fs'); var path = require('path'); var mime = require('mime'); //加载url模块 var url = require('url'); //加载underscore var _ = require('underscore'); //加载querystring模块 var querystring = require('querystring'); //2.创建http服务 http.createServer(function(req, res) { //为res对象添加一个render()函数,方便后续使用 //第二个参数tplData的作用是用来传递html页面中要使用的模板数据 res.render = function(filename, tplData) { fs.readFile(filename, function(err, data) { if (err) { res.writeHead(404, 'Not Found', { 'Content-Type': 'text/html;charset=utf-8' }); res.end("404,page not found."); return; } if (tplData) { //如果用户传递了模版数据,表示要进行模板替换 var fn = _.template(data.toString('utf8')); data = fn(tplData); } res.setHeader("Content-Type", mime.getType(filename)); res.end(data); }) } //设计路由 //当用户请求 / 或者 /index的时候,显示新闻列表---get请求 //当用户请求 /item的时候,显示新闻详情---get请求 //当用户请求 /submit的时候,显示添加新闻页面---get请求 //当用户请求 /add时,将用户提交的新闻保存到data.json文件中---get请求 //当用户请求 /add时,将用户提交的新闻保存到data.json文件中---post请求 //将用户请求的url和method转换为小写字母 req.url = req.url.toLowerCase(); req.method = req.method.toLowerCase(); //通过url模块,调用url.parse()方法解析用户请求的url(req.url) var urlObj = url.parse(req.url, true); //根据用户请求的路径,将对应的html页面显示出来 if (req.url === '/' || req.url === '/index' && req.method === 'get') { readNewsData(function(arr) { //2.在服务器端使用模板引擎,将arr中的数据和index.html文件中的内容结合,渲染给客户端 res.render(path.join(__dirname, 'views', 'index.html'), { arr: arr }); }); } else if (urlObj.pathname === '/item' && req.method === 'get') { //读取detail.html并返回 //1.获取当前用户请求的新闻的id //urlObj.query.id //2.读取 data.json文件中的数据,根据 id 找到对应新闻 readNewsData(function(list_news) { var model = null; //循环 list_news中的数据,找到和id值相等的数据 for (var i = 0; i < list_news.length; i++) { //判断集合中是否有与用户提交的id相等的新闻 if (list_news[i].id.toString() === urlObj.query.id) { //如果找到了对等的新闻 则将其记录下来 model = list_news[i]; break; } } if (model) { res.render(path.join(__dirname, 'views', 'detail.html'), { item: model }); } else { res.end("NO such item"); } }); } else if (req.url === '/submit' && req.method === 'get') { //读取submit.html并返回 res.render(path.join(__dirname, 'views', 'submit.html')); } else if (req.url.startsWith('/add') && req.method === 'get') { readNewsData(function(arr) { urlObj.query.id = arr.length; arr.push(urlObj.query); writeNewsData(JSON.stringify(arr),function(){ res.writeHead(302, 'Found', { 'Location': '/' }); res.end(); }); }); } else if (req.url === '/add' && req.method === 'post') { //1.读取data.json文件中的数据 readNewsData(function(arr) { //2.读取用户post提交的数据 postData(req, function(postBody) { //3.为用户提交的新闻增加一个id属性,并把新闻对象push到arr数组中 postBody.id = arr.length; arr.push(postBody); //4.将新的list写入到data.json文件中 writeNewsData(JSON.stringify(arr), function() { res.writeHead(302, 'Found', { 'Location': '/' }) res.end(); }); }) }); } else if (req.url.startsWith('/resources') && req.method === 'get') { //如果用户请求是以/resources开头,并且是get请求,就认为用户是要请求静态资源 res.render(path.join(__dirname, req.url)); } else { res.writeHead(404, 'Not Found', { 'Content-Type': 'text/html;charset=utf-8' }); res.end("404,page not found."); } }).listen(8888, function() { console.log("http://localhost:8888"); }) //封装读取data.json文件的方法 function readNewsData(callback) { fs.readFile(path.join(__dirname, "data", 'data.json'), 'utf8', function(err, data) { if (err && err.code !== 'ENOENT') { throw err; } var arr = JSON.parse(data || '[]'); //通过调用回调函数callback()将读取到的数据arr 传递出去 callback(arr); }); } //封装写入data.json文件的方法 function writeNewsData(data, callback) { fs.writeFile(path.join(__dirname, 'data', 'data.json'), data, function(err) { if (err) { throw err; } //调用 callback()来执行当写入数据完毕后的操作 callback(); }) } //封装一个获取用户 post 提交的数据的方法 function postData(req, callback) { var list = []; req.on('data', function(chunk) { list.push(chunk); }); req.on('end', function() { var postBody = Buffer.concat(list); postBody = postBody.toString('utf8'); postBody = querystring.parse(postBody); //把用户post提交的数据传递出去 callback(postBody); }); } ~~~