详解本地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 相关文章推荐
JavaScript和ActionScript的交互实现代码
Aug 01 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
Feb 17 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
学习JavaScript事件流和事件处理程序
Jan 25 Javascript
微信开发 js实现tabs选项卡效果
Oct 28 Javascript
javascript笔记之匿名函数和闭包
Feb 06 Javascript
用node和express连接mysql实现登录注册的实现代码
Jul 05 Javascript
简单介绍react redux的中间件的使用
Apr 06 Javascript
JS面试题大坑之隐式类型转换实例代码
Oct 14 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
详解Vue 换肤方案验证
Aug 28 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
Apr 26 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中获取文件扩展名的N种方法小结
2012/02/27 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
详解PHP数组赋值方法
2015/11/07 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
用javascript控制iframe滚动的代码
2007/04/10 Javascript
js最简单的拖拽效果实现代码
2010/09/24 Javascript
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
bootstrap中添加额外的图标实例代码
2017/02/15 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
Python之PyUnit单元测试实例
2014/10/11 Python
Python实现处理管道的方法
2015/06/04 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
Django框架视图介绍与使用详解
2019/07/18 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
Django websocket原理及功能实现代码
2020/11/14 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
学生个人自我鉴定范文
2014/03/28 职场文书
家长通知书教师评语
2014/04/17 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
员工试用期自我评价
2014/09/18 职场文书
倡议书格式及范文
2015/04/29 职场文书
欠款起诉书范文
2015/05/19 职场文书