详解本地Node.js服务器作为api服务器的解决办法


Posted in Javascript onFebruary 28, 2017

在看react-native教程的时候,遇到要在手机端调试,需要api服务器,但是由于Node.js自己就作为服务器,没有apache怎么解决这个问题,用apache和nginx也可以解决,但是有点复杂,我们就使用node已有的模块解决这个问题.

//服务器端的代码
var express = require('express');

var app = express();

// set up handlebars view engine
var handlebars = require('express3-handlebars')
  .create({ defaultLayout:'main' });
app.engine('handlebars', handlebars.engine);
app.set('view engine', 'handlebars');

app.set('port', process.env.PORT || 3000);

app.use(express.static(__dirname + '/public'));

var fortuneCookies = [
  "Conquer your fears or they will conquer you.",
  "Rivers need springs.",
  "Do not fear what you don't know.",
  "You will have a pleasant surprise.",
  "Whenever possible, keep it simple.",
];

app.get('/', function(req, res) {
  res.render('home');
});
app.get('/about', function(req,res){
  var randomFortune = 
    fortuneCookies[Math.floor(Math.random() * fortuneCookies.length)];
  res.render('about', { fortune: randomFortune });
});

// 404 catch-all handler (middleware)
app.use(function(req, res, next){
  res.status(404);
  res.render('404');
});

// 500 error handler (middleware)
app.use(function(err, req, res, next){
  console.error(err.stack);
  res.status(500);
  res.render('500');
});

app.listen(app.get('port'), function(){
 console.log( 'Express started on http://localhost:' + 
  app.get('port') + '; press Ctrl-C to terminate.' );
});

上面这段代码在127.0.0.1:3000端口启动一个本地服务器,但是在手机端是不能访问的.

我们再启动另一个node.js服务器来解决这个问题.

//proxy.js
  var http = require('http'), 
     httpProxy = require('http-proxy'); //引入这个模块

// 新建一个代理 Proxy Server 对象 
var proxy = httpProxy.createProxyServer({}); 

// 捕获异常 
proxy.on('error', function (err, req, res) { 
 res.writeHead(500, { 
  'Content-Type': 'text/plain' 
 }); 
 res.end('Something went wrong. And we are reporting a custom error message.'); 
}); 

// 另外新建一个 HTTP 80 端口的服务器,也就是常规 Node 创建 HTTP 服务器的方法。 
// 在每次请求中,调用 proxy.web(req, res config) 方法进行请求分发 
var server = require('http').createServer(function(req, res) { 
 // 在这里可以自定义你的路由分发 
 var host = req.headers.host, ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; 
 console.log("client ip:" + ip + ", host:" + host); 

 switch(host){ //意思是监听下面的ip地址,如果匹配就转到
//127.0.0.1:3000地址
  case '192.168.0.101:8080':  //监听这个地址
  //这个地址在window上用ipconfig查看,mac/linux用ifconfig查看

  case 'bbs.aaaa.com': 
    proxy.web(req, res, { target: 'http://127.0.0.1:3000' }); //转到这个地址
  break; 

  default: 
    res.writeHead(200, { 
      'Content-Type': 'text/plain' 
    }); 
    res.end('Welcome to my server!'); 
 } 
}); 

console.log("listening on port 8080") 
server.listen(8080);

node proxy.js 以后启动了proxy服务器.可以通过电脑的ip地址访问127.0.0.1的api路由了。

如果是使用nginx也可以达到要求,在mac上使用homebrew包管理相当方便

bash下 安装 brew install nginx

启动 brew services start nginx

如果安装了atom编辑器

bash在 直接 atom /usr/local/etc/nginx/nginx.conf 打开配置文件本分以后做出修改

下面是nginx.conf的配置文件

//nginx.conf

 #原来的文件另存后。直接使用下面内容替换nginx.conf的内容


events {
  worker_connections 1024;
}
http {
  include    mime.types;
  default_type application/octet-stream;

  #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  #         '$status $body_bytes_sent "$http_referer" '
  #         '"$http_user_agent" "$http_x_forwarded_for"';



  sendfile    on;
  #tcp_nopush   on;

  #keepalive_timeout 0;
  keepalive_timeout 65;



  server {
    listen 8080; #监听80880端口
    server_name www.penguu.com 192.168.1.100; #这里是真机要访问的地址。
    # Mac 通过终端 ifconfig 查看。比如我查看的就是192.168.1.100
    #手机访问的接口就是 192.168.1.100:8080
    #实际在23行监听的端口可以是80端口,由于浏览器默认就是80端口。但是在mac中有权限问题。所#以就使用8080端口
    # address_book中的service中的地址也要修改路径是
    # view/service.js->host,修改为 192.168.1.100:8080

    #access_log /var/log/nginx/test.log;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-Nginx-Proxy true;
      proxy_set_header Connection "";
      proxy_pass   http://127.0.0.1:3000; # address_book的 server地址,就是本地node.js服务器的ip地址
      #node.js默认就是127.0.0.1 ,port:3000是在app.js中设定的。可以修改。

    }

  }

  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js onpropertychange输入框 事件获取属性
Mar 26 Javascript
jquery 事件对象属性小结
Apr 27 Javascript
jquery的父子兄弟节点查找示例代码
Mar 03 Javascript
JQuery.get提交页面不跳转的解决方法
Jan 13 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
Jan 04 Javascript
分享网页检测摇一摇实例代码
Jan 14 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
JS非空验证及邮箱验证的实例
Aug 11 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
May 08 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
Jun 11 Javascript
bootstrap 路径导航 分页 进度条的实例代码
Aug 06 Javascript
js简单的分页器插件代码实例
Sep 11 Javascript
jquery操作select取值赋值与设置选中实例
Feb 28 #Javascript
JS使用面向对象技术实现的tab选项卡效果示例
Feb 28 #Javascript
基于cookie实现zTree树刷新后展开状态不变
Feb 28 #Javascript
js中Number数字数值运算后值不对的解决方法
Feb 28 #Javascript
canvas绘图不清晰的解决方案
Feb 28 #Javascript
jQuery树控件zTree使用方法详解(一)
Feb 28 #Javascript
js数字计算 误差问题的快速解决方法
Feb 28 #Javascript
You might like
php读取msn上的用户信息类
2008/12/05 PHP
php获取系统变量方法小结
2015/05/29 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
jQuery中contents()方法用法实例
2015/01/08 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
python绘制条形图方法代码详解
2017/12/19 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
2019/04/01 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
python实现的分层随机抽样案例
2020/02/25 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
python 绘制正态曲线的示例
2020/09/24 Python
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
10的分与合教学反思
2014/04/30 职场文书
质量月活动总结
2014/08/26 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
婚宴邀请函
2015/01/30 职场文书
学生个人总结范文
2015/02/15 职场文书
MYSQL 表的全面总结
2021/11/11 MySQL
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers