作为一个前端开发人员,对接接口是常有的事,特别是前后端分离的时候。但很多时候,在我们需要对接接口时,后端可能出于各种原因,并没有我们想要的接口,这时候,自己模拟一个服务器就变得尤为重要。也许对于一般的ajax请求,你写一个异步函数就勉强能搞定,但是对于像下拉加载更多内容这样的业务,不仅要有够真实的数据做支撑,还有存在请求出错情况的处理,所以单单的异步函数已经不能满足要求了。这时候,搭建一个简单的服务器,就会省很多事。如果,把平时的请求json文件,改成一个真实的ajax请求,返回data数据,并模拟好各种请求响应状态,那么,我们做好的功能,对于后端提供的接口来说,是只需改变一下请求url就可以做到的事,不用再次编写请求处理逻辑。所以,今天就讲一下使用nodejs搭建一个服务器的简单方法,如果你利用得好,url都可以提前定义为跟后端提供的一样,最后对接时只需改一下配置文件的服务器域名即可。下面直接附上代码,包括文件上传的接口也是有的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
var express = require("express"); var bodyParser = require("body-parser"); var app = express(); //文件读取依赖 var fs = require('fs'); var marked = require( "marked" ); //文件上传依赖 var multer = require('multer'); const UPLOAD_PATH = './uploads'; var upload = multer({ dest: UPLOAD_PATH }); var hostName = '127.0.0.1'; var port = 80; app.use(bodyParser.json()); // 解析json application/json /* bodyParser.urlencoded 用来解析 request 中 body的 urlencoded字符, 只支持utf-8的编码的字符,也支持自动的解析gzip和 zlib 当extended为false的时候,键值对中的值就为'String'或'Array'形式,为true的时候,则可为任何数据类型。 */ app.use(bodyParser.urlencoded({ extended: true }));// 解析表单 application/x-www-form-urlencoded // app.use()用于在访问到最终目标之前做一些事情 app.use(function (req,res,next) {//不调用next就不继续往下走 console.log("请求来啦,在处理之前刷一下存在感"); //console.log(req); next(); }); //all表示所有的方法,*表示所有的路径,一般放到最后 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); res.header("X-Powered-By",' 3.2.1') res.header("Content-Type", "application/json;charset=utf-8"); next(); }); //http://127.0.0.1:1024/get?hehe=1123 app.get("/get",function(req,res){ console.log("请求url:",req.path) console.log("请求参数:",req.query) res.send("这是get请求"); }) //http://127.0.0.1:1024/post app.post("/post",function(req,res){ // 单独配置 //res.setHeader("Content-Type", "application/json;charset=utf-8"); console.log("请求参数:",req.path); console.log("请求参数:",req.body); var result = {code:200,msg:"post请求成功"}; res.send(result); }); //读取文件返回txt app.post('/file', function(req, res) { var path="./file/test.txt"; fs.readFile(path, function(err, data){ if(err){ console.log(err); res.send("文件不存在!"); }else{ //console.log(data); str = marked(data.toString()); //console.log(str); res.json(str) ; } }); }); //读取文件返回json app.post('/json', function(req, res) { //文件路径,__dirname为当前运行js文件的目录 //var path = path.join(__dirname, 'file/test.json'); var path="./file/data.json"; var params = req.body; var page = params.pageNo || 1; var pageSize = params.pageSize || 10; if(page > 3){ pageSize = 6; } if(page > 4){ pageSize = 0; } fs.readFile(path,'utf8',function(err, data){ if(err){ console.log(err); res.send("文件不存在!"); }else{ //以文本文件的方式处理处理 //str = marked(data.toString()); //console.log(str); //res.json(str); var dataObj = JSON.parse(data); // console.log(dataObj); // console.log(dataObj.data); var data = dataObj.data.slice(0,pageSize); res.send({ code:0, data:data, count:101, msg:'' }); // console.log(data); // res.send('请求成功'); } }); }); //读取文件返回json app.post('/doubanmovie', function(req, res) { //文件路径,__dirname为当前运行js文件的目录 //var path = path.join(__dirname, 'file/test.json'); var path="./file/douban.json"; var params = req.body; console.log(params); var page = params.pageNo || 1; var pageSize = params.pageSize || 5; console.log(pageSize); fs.readFile(path,'utf8',function(err, data){ if(err){ res.send("文件不存在!"); }else{ var dataObj = JSON.parse(data); var start = (page-1) * pageSize; if(start < dataObj.total){ dataObj.subjects = dataObj.subjects.slice(start,start+pageSize); }else{ dataObj.subjects = []; }; dataObj.count = dataObj.subjects.length; res.send(dataObj); } }); }); /* //单个文件上传 app.post('/upload', upload.single('fileUpload'), function (req, res, next) { const { file } = req; fs.readFile(file.path, function(err, data) { fs.writeFile(`${UPLOAD_PATH}/${file.originalname}`, data, function (err) { if (err){ res.json({ code:0, file:file, msg:err }) }else{ res.json({ code:0, file:file, msg: '上传成功' }); } }); }) }) */ //多文件上传 app.post('/multipartUpload', upload.array('fileUpload'), function (req, res, next) { const files = req.files; console.log(files); const success = []; const fail = []; const result = new Promise((resolve, reject) => { files.map((v) => { fs.readFile(v.path, function(err, data) { fs.writeFile(`${UPLOAD_PATH}/${v.originalname}`, data, function(err, data) { if (err){ reject(err); fail.push({file:v}); }else{ success.push({file:v}); resolve('成功'); } }) }) }) }); result.then(r => { // res.json({ // code:0, // success:success, // fail:fail, // msg: '上传成功' // }); console.log(success); }).catch(err => { // res.json({ // code:-1, // success:success, // fail:fail, // msg: err // }); console.log(fail); }); }) //文件上传所需代码 //设置文件上传路径和文件命名 var storage = multer.diskStorage({ destination: function (req, file, cb){ //文件上传成功后会放入uploads文件夹 cb(null, './uploads') }, filename: function (req, file, cb){ //设置文件的名字为其原本的名字,也可以添加其他字符,来区别相同文件,例如file.originalname+new Date().getTime();利用时间来区分 cb(null, file.originalname) } }); var upload = multer({storage: storage}); //处理来自页面的ajax请求。single文件上传 app.post('/upload', upload.single('file'), function (req, res, next) { //拼接文件上传后的网络路径 console.log("file:"+req.file.originalname) //res.end(req.file.originalname); res.json({ code:0, file:req.file.originalname, path:'uploads/'+req.file.originalname, msg:'' }); // fs.readFile(file.path, function(err, data) { // fs.writeFile(`${UPLOAD_PATH}/${file.originalname}`, data, function (err) { // if (err){ // res.json({ // code:0, // file:file, // msg:err // }) // }else{ // res.json({ // code:0, // file:file, // msg: '上传成功' // }); // } // }); // }) }); // 单域多文件上传:input[file]的 multiple=="multiple" // app.post('/multipartUpload', upload.array('fileupload', 5), function(req, res, next) { // // req.files 是前端表单name=="imageFile" 的多个文件信息(数组),限制数量5,应该打印看一下 // var fileName = ""; // console.log(req.file); // console.log(req.files); // // for (var i = 0; i < req.files.length; i++) { // // // 图片会放在uploads目录并且没有后缀,需要自己转存,用到fs模块 // // // 对临时文件转存,fs.rename(oldPath, newPath,callback); // // fileName+=req.files[i].originalname+";" // // fs.rename(req.files[i].path, "uploads/" + req.files[i].originalname, function(err) { // // if (err) {throw err;} // // console.log('done!'); // // }) // // } // res.writeHead(200, {"Access-Control-Allow-Origin": "*"});//允许跨域。。。 // // req.body 将具有文本域数据, 如果存在的话 // // res.end(JSON.stringify(req.files)+JSON.stringify(req.body)); // console.log("fileName:"+fileName) // res.end(fileName) // }) app.listen(port,hostName,function(){ console.log(`服务已开启,访问地址为http://${hostName}:${port}`); }); |
为方便预读和日后个人查看知识点,基本上该有的注释我都加上了。如果,你具有nodejs的基础,上面代码相信你一看就基本上懂了。依赖文件package.json如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "name": "nodeweb", "version": "1.0.0", "description": "", "main": "server.js", "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.4", "fs": "^0.0.1-security", "marked": "^0.5.1", "multer": "^1.4.1" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node server.js" }, "author": "", "license": "ISC" } |
本文写于2019年1月1日,在发布本文前以上的代码本人亲测可用,如读者看到时,代码不能成功执行,可检查依赖包的版本或nodejs的兼容问题。
发表评论