详解本地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 相关文章推荐
Node.js实现的简易网页抓取功能示例
Dec 05 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
Aug 15 Javascript
Spring mvc 接收json对象
Dec 10 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
Dec 17 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
jQuery实现base64前台加密解密功能详解
Aug 29 jQuery
angular2系列之路由转场动画的示例代码
Nov 09 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
May 17 Javascript
基于Koa2写个脚手架模拟接口服务的方法
Nov 27 Javascript
微信小程序组件传值图示过程详解
Jul 31 Javascript
js的新生代垃圾回收知识点总结
Aug 22 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性能优化的介绍
2013/06/20 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
类似框架的js代码
2006/11/09 Javascript
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
Python基础之函数用法实例详解
2014/09/10 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
基于Python的PIL库学习详解
2019/05/10 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
python实现五子棋人机对战游戏
2020/03/25 Python
pymysql的简单封装代码实例
2020/01/08 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
教师四风问题对照检查材料
2014/09/26 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题