详解本地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 相关文章推荐
SeaJS入门教程系列之完整示例(三)
Mar 03 Javascript
javascript强制点击广告的方法
Feb 06 Javascript
JavaScript数组前面插入元素的方法
Apr 06 Javascript
代码分析jQuery四种静态方法使用
Jul 23 Javascript
javascript事件处理模型实例说明
May 31 Javascript
JS中如何比较两个Json对象是否相等实例代码
Jul 13 Javascript
利用JavaScript判断浏览器类型及版本
Aug 23 Javascript
简单实现bootstrap导航效果
Feb 07 Javascript
react-native 圆弧拖动进度条实现的示例代码
Apr 12 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
Nov 02 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 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
解析yii数据库的增删查改
2013/06/20 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
基于Jquery实现表格动态分页实现代码
2011/06/21 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
分享jQuery封装好的一些常用操作
2016/07/28 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
对python3标准库httpclient的使用详解
2018/12/18 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
测绘工程个人的自我评价
2013/11/10 职场文书
高中生毕业学习总结的自我评价
2013/11/14 职场文书
毕业研究生的自我鉴定
2013/11/30 职场文书
工地门卫岗位职责
2013/12/30 职场文书
法学院毕业生求职信
2014/06/25 职场文书
高中教师个人总结
2015/02/10 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏
springboot实现string转json json里面带数组
2022/06/16 Java/Android