详解本地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 原型继承介绍
Aug 30 Javascript
Node.js中调用mysql存储过程示例
Dec 20 Javascript
使用CamanJS在Web页面上处理图像的技巧
Aug 18 Javascript
深入浅析JavaScript中对事件的三种监听方式
Sep 29 Javascript
开启Javascript中apply、call、bind的用法之旅模式
Oct 28 Javascript
Highcharts使用简例及异步动态读取数据
Dec 30 Javascript
JavaScript表单验证实例之验证表单项是否为空
Jan 10 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
Feb 05 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
Mar 05 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
Aug 19 Javascript
使用vue构建多页面应用的示例
Oct 22 Javascript
Angular处理未可知异常错误的方法详解
Jan 17 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中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
python处理csv数据的方法
2015/03/11 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
详解django.contirb.auth-认证
2018/07/16 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
python 异步async库的使用说明
2020/05/04 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
2015年党员个人剖析材料
2014/12/18 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
如何解决php-fpm启动不了问题
2021/11/17 PHP
我去timi了,一起去timi是什么意思?
2022/04/13 杂记
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技