server.js

var http=require('http')
var handleUrl=require('./handleUrl')
var config = require('./config');
http.createServer(function(req,res){
res.writeHead(200, {
'Content-Type': 'text/plain',
'Content-Type':'text/html; charset=utf-8'
});
res.write(handleUrl(req.url)+"")
res.end();
}).listen(config.port)

  handleUrl.js

var config=require('./config')
var fs=require('fs')
var path=require('path')
const { URL } = require('url');
const querystring = require('querystring'); module.exports=function(url){
//判断请求的路径中有没有api
if(url.indexOf(config.ApiSuffix)>-1){
return parseUrl(url)
}else{
return parseStaticUrl(url)
}
}
//静态资源请求路径处理
function parseStaticUrl(url){
if(url.indexOf('favicon.ico')<=-1){
var urlObj=require('url').parse(url)
var pathname=urlObj.pathname;
var filepath=path.resolve(config.staticFile+pathname);//获取文件的绝对地址
return fs.readFileSync(filepath).toString('utf8');
}
}
//api请求路径处理
function parseUrl(url){
if(url.indexOf('favicon.ico')<=-1){
var urlObj=require('url').parse(url)
var pathname=urlObj.pathname;
var reg=new RegExp("\/(\\w+)\\"+config.ApiSuffix+"$");
var funame=pathname.match(reg)[1];//获取要执行的方法名
var filepath=path.resolve(pathname.substr(1,pathname.lastIndexOf("/")-1)+".js");//获取文件的绝对地址
var param=querystring.parse(urlObj.query)//把参数解析成对象
var targetfile=require(filepath);
return targetfile[funame](param)
}
}

  config.js

module.exports={
ApiSuffix:'.do',//api请求后缀
staticFile:'./static',//存放静态资源的文件夹路径
port:9999//端口号
}

  controller/user.js

module.exports={
name : 8888888888888,
addUser : function(obj){
return "您要增加的用户名字是"+obj.name+"";
}
}

  

api访问举例  http://localhost:9999/controller/user/addUser.do?name=5555

返回的结果是

您要增加的用户名字是5555

最新文章

  1. netty ByteToMessageDecoder 分析
  2. C# Dictionary几种遍历方式
  3. [C++]C++标准里 string和wstring
  4. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
  5. 《Programming WPF》翻译 第6章 5.我们进行到哪里了?
  6. Matlab学习笔记(1)
  7. [ERROR] Terminal initialization failed; falling back to unsupported java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
  8. 1033. To Fill or Not to Fill (25) -贪心算法
  9. JSP(二):JSP九大内置对象、四个作用域对象
  10. C语言实现链栈的初始化&amp;进栈&amp;出栈&amp;读取栈顶元素
  11. C#和.Net的关系
  12. SQL Server基础之表级触发器
  13. 2019.4.1考试&amp;2019.4.2考试&amp;2019.4.4考试
  14. 洛谷P3185 分裂游戏
  15. .NET Core微服务之路:利用DotNetty实现一个简单的通信过程
  16. android 安卓APP获取手机设备信息和手机号码的代码示例
  17. ApkTool反编译和重新打包
  18. MySQL Replication 线程(理解详细过程)
  19. 使用jenkins管理uirecorder录制的任务
  20. 国内外三个领域巨头告诉你Redis怎么用

热门文章

  1. Bootstrap 下拉菜单(dropdown)插件
  2. (67)windows安装zabbix监控
  3. java的面向对象 (2013-09-30-163写的日志迁移
  4. python 面对对象基础
  5. 七周成为数据分析师06_MySQL
  6. Anaconda的安装、使用以及与PyCharm的链接
  7. Kubernetes(k8s)底层网络原理刨析
  8. 水题:UVa489-Hangman Judge
  9. springboot-vue-自定义注解限制接口调用
  10. luogu2394 yyy loves Chemistry I