【HAVENT原创】Node Express API 通用配置

为什么80%的码农都做不了架构师?>>>   hot3.png

( 基于 Express 4.x )

启动文件 /app.js:

var express = require('express');
var bodyParser = require('body-parser');
var proxy = require('http-proxy-middleware');
var path = require('path');var index = require('./routes/index');
var data = require('./routes/data');var app = express();/* 设置静态目录 */
app.use(express.static('src'));/* 启用反向代理 */
var options = {target: 'http://localhost:8080/h5', // 目标主机changeOrigin: true,//secure: false,// ws: true,// pathRewrite: {//     '^/api' : '/h5/api'// }
};
var apiProxy = proxy(options);  // 开启代理功能,并加载配置
app.use('/api', apiProxy);      // 对地址为’/‘的请求全部转发// Node Express API 路由配置
app.use('/', index);
app.use('/data', data);// // catch 404 and forward to error handler
// app.use(function(req, res, next) {
//     var err = new Error('Not Found');
//     err.status = 404;
//     next(err);
// });// // error handler
// app.use(function(err, req, res, next) {
//     // set locals, only providing error in development
//     res.locals.message = err.message;
//     res.locals.error = req.app.get('env') === 'development' ? err : {};
//
//     // render the error page
//     res.status(err.status || 500);
//     res.render('error');
// });/* json 输出支持, 启动服务 */
app.use(bodyParser.json());
app.listen(7788);var url = "http://localhost:7788";
console.log('listen: ' + url);/* 启动浏览器访问站点 */
var child_process = require("child_process");
var cmd = 'start ' + url;if(process.platform == 'linux'){cmd  = 'xdg-open ';
}else if(process.platform == 'darwin'){cmd  = 'open ';
}
// else{ // process.platform == 'win32'
//     cmd  = 'start "%ProgramFiles%\Internet Explorer\iexplore.exe"';
// }child_process.exec(cmd + ' "'+url + '"');
//child_process.exec(cmd + url);

 

路由配置 /routes/index.js

var express = require('express');
var router = express.Router();/* GET home page data. */
router.get('/', function(req, res, next) {res.send({ title: '首页' });
});router.get('/login', function(req, res, next) {res.send({ title: '登录' });
});module.exports = router;

 

路由配置 /routes/data.js

var express = require('express');
var router = express.Router();
var fs = require('fs');
var PATH = './public/data/';//读取数据模块,供客户端调用
//查询接口,token校验
//公共接口,无需校验
//data/read?type=it
//data/read?type=it.json
router.get('/read', function(req, res, next) {var type = req.param('type') || "";fs.readFile(PATH + type + '.json', function (err, data){if(err){return res.send({success: false,message: '读取文件异常'});}var COUNT = 50;// TODO: try{}catch(){}var obj =[];try{obj = JSON.parse(data.toString());}catch(e){obj = [];}if(obj.length > COUNT){obj = obj.slice(0, COUNT);}return res.send({success: true,data:obj});});
});// 数据存储模块——后台开发使用
router.post('/write',function(req, res, next){if(!req.cookies.user){return res.render('login',{});}// 文件名var type = req.param('type') || "";// 关键字段var url = req.param('url') || '';var title = req.param('title') || '';var img = req.param('img') || '';if(!type || !url || !title || !img){return res.send({success: false,message:'提交的字段不全'});}//1)读取文件var filePath = PATH + type + '.json';fs.readFile(filePath, function(err, data){if(err){return res.send({success: false,message: '读取数据失败'});}var arr = JSON.parse(data.toString());//代表每一条记录var obj = {img: img,url: url,title: title,id: guidGenerate(),time: new Date()};arr.splice(0, 0, obj);//2)写入文件var newData = JSON.stringify(arr);fs.writeFile(filePath, newData, function(err){if(err){return res.send({status:0,info: '写入文件失败'});}return res.send({success: true,message: obj});});});
});//阅读模块写入接口 后台开发使用
router.post('/write_config', function(req, res, next){if(!req.cookies.user){return res.render('login',{});}//TODO:后期进行提交数据的验证//防xss攻击 xss// npm install xss// require('xss')// var str = xss(name);var data = req.body.data;//TODO : try catchvar obj = JSON.parse(data);var newData = JSON.stringify(obj);// 写入fs.writeFile(PATH + 'config.json',newData, function(err, data){if(err){return res.send({success: false,message: '写入数据失败'});}return res.send({success: true,message:'数据写入成功',data:newData})})
});//登录接口
router.post('/login', function(req, res, next){//用户名、密码、验证码var username = req.body.username;var password = req.body.password;//TODO :对用户名、密码进行校验//xss处理、判空//密码加密 md5(md5(password + '随机字符串'))//密码需要加密-> 可以写入JSON文件if(username === 'admin' && password === '123456'){res.cookie('user',username);return res.send({success: true});}return res.send({success: false,message: '登录失败'});
});// guid
function guidGenerate() {return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random() * 16 | 0,v = c == 'x' ? r : (r & 0x3 | 0x8);return v.toString(16);}).toUpperCase();
}module.exports = router;

 

转载于:https://my.oschina.net/u/943746/blog/1826484

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux串口设置参数

为什么80%的码农都做不了架构师?>>> 在Linux环境下,串口名从ttyS0开始依次是ttyS1、ttyS2等。在本程序中,使用ttyS0作为通信串口。在打开ttyS0的时候选项 O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信…

STM32F013 十元板

我大拇指般大小。STM32F103C8T6,64K Flash,20K RAM,m3的核。十元,应该是价格极限了吧。 通过USB供电(5V),也可以排针3.3V供电。可惜没有引出5V排针。USB口可以供电和USB通讯,没有USB…

作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars

为什么需要使用模板引擎? 关于为什么要使用模板引擎,按照我常说的一句话就是:不用重复造轮子了。 简单来说,模板最本质的作用是“变静为动”,一切利于这方面的都是优势,不利于的都是劣势。要想很好地实现“…

Zabbix3.4安装详细步骤

Zabbix3.4安装的详细步骤一、zabbix介绍现在大多数公司都会用到监控软件,主流的监控软件就是Zabbix了,当然还会有Nagios等其他的软件:zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种…

cs231n---语义分割 物体定位 物体检测 物体分割

1 语义分割 语义分割是对图像中每个像素作分类,不区分物体,只关心像素。如下: (1)完全的卷积网络架构 处理语义分割问题可以使用下面的模型: 其中我们经过多个卷积层处理,最终输出体的维度是C*H…

array_combine()

转载于:https://www.cnblogs.com/xiaobiaomei/p/8392728.html

composer windows安装

一.前期准备: 1.下载安装包,https://getcomposer.org/download/ 2.在php.ini文档中打开extensionphp_openssl.dll 3.下载php_ssh2.dll、php_ssh2.pdb,http://windows.php.net/downloads/pecl/releases/ssh2/0.12/ 4.把php_ssh2.dll、php_ssh2.pdb文件放php的ext文件夹 5.重启ap…

spring整合mybatis采坑

本来这个错误是整合spring和mybatis遇到的错误,但是一直没有解决,但是在做SpringMVC时也了出现了这样的错误org.springframework.beans.factory.BeanCreationException: Error creating bean with name sqlSessionFactory defined in class path resourc…

处理测试环境硬盘爆满

测试环境经常会收到这类告警 第一步 登陆机器查看硬盘使用 执行df 好吧,使用情况真不妙,根目录占用过大 第二步 确定哪个文件太大或者文件过多 进入爆满的目录,如这里是根目录 cd / 然后找下面哪个文件夹或者文件太大,有几种方式: 1.dusudo du -h --max-depth1 | sort -hr 越前…

LeetCode-46. Permutations

一、问题描述 就是全排列问题。 二、问题解决 应该哪一本数据结构的书上都有讲了。 void get_permute(vector<int>& nums, int pos, vector<vector<int>>& result) {if (nums.size() pos) {result.push_back(nums);return;}for (int i pos; i <…

789. 逃脱阻碍者

789. 逃脱阻碍者 你在进行一个简化版的吃豆人游戏。你从 [0, 0] 点开始出发&#xff0c;你的目的地是 target [xtarget, ytarget] 。地图上有一些阻碍者&#xff0c;以数组 ghosts 给出&#xff0c;第 i 个阻碍者从 ghosts[i] [xi, yi] 出发。所有输入均为 整数坐标 。 每一…

计算机视觉-自定义对象检测器

1、模板匹配 运行指令&#xff1a;python template_matching.py --source 3.jpg --template 2.jpg import argparse import cv2ap argparse.ArgumentParser() ap.add_argument("-s", "--source", requiredTrue, help"Path to the source image"…

297. 二叉树的序列化与反序列化

297. 二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现…

Python 08 面向对象

Python 面向对象 1、编程范式 2、面向对象特性 3、属性、方法 4、三大特性 5、高级方法 6、类的特殊成员方法 7、反射 8、异常处理 9、单例模式 一、编程范式 编程&#xff1a;程序员用特定的语法数据结构算法组成的代码来告诉计算机如何执行任务的过程 &#xff0c; 实现一个…

eclipse手动添加SVN插件

https://www.cnblogs.com/hcl1991/p/5888461.html 1.手动下载svn插件&#xff08;百度SVNsite-1.8.18&#xff09; 2.将下载好的SVNsite-1.8.18.zip 解压 3.在eclipse安装目录的plugins新建SVN文件夹 4.将SVNsite-1.8.18解压包下的features和plugins拷贝到新建的SVN文件夹下 5.…

440. 字典序的第K小数字

440. 字典序的第K小数字 给定整数 n 和 k&#xff0c;找到 1 到 n 中字典序第 k 小的数字。 注意&#xff1a;1 ≤ k ≤ n ≤ 109。 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]&#xff0c;所以第二小的数字是…

JDK 11 还有一个处于计划阶段的 JEP:让其支持 TLS 1.3

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> JDK 11 最近有什么消息&#xff1f;我们不妨来看一下它的进展情况&#xff0c;包括最新的 JEP 提案。Java 的新版本发布计划意味着总会有一款新的 JDK 即将推出。根据他们的计划&a…

498. 对角线遍历

498. 对角线遍历 给定一个含有 M x N 个元素的矩阵&#xff08;M 行&#xff0c;N 列&#xff09;&#xff0c;请以对角线遍历的顺序返回这个矩阵中的所有元素&#xff0c;对角线遍历如下图所示。 示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,4,7,5…

Squid 访问控制配置

Squid 访问控制配置 主配置文件内加入限制参数 vim /etc/squid/squid.conf # 访问控制 acl http proto HTTP # 限制访问 good_domain添加两个域名“.”表示半解析(相当于*) acl good_domain dstdomain .kevin.net .baidu.com # 允许good_domain内的域名访问 http_access allow …

创建react应用程序_通过构建电影搜索应用程序在1小时内了解React

创建react应用程序If youve been meaning to learn React but are unsure of where to start, Scrimbas brand new Build a Movie Search App course is perfect for you! 如果您一直想学习React&#xff0c;但是不确定从哪里开始&#xff0c;那么Scrimba全新的Build a Movie S…