详解本地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 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
javascript qq右下角滑出窗口 sheyMsg
Mar 21 Javascript
基于JQUERY的多级联动代码
Jan 24 Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 Javascript
网页右下角弹出窗体实现代码
Jun 05 Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
Jun 07 Javascript
Angular2库初探
Mar 01 Javascript
js构造函数创建对象是否加new问题
Jan 22 Javascript
vue-devtools的安装步骤
Apr 23 Javascript
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 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
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
javascript jQuery插件练习
2008/12/24 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
Python获取当前时间的方法
2014/01/14 Python
Python的ORM框架SQLObject入门实例
2014/04/28 Python
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Python魔法方法详解
2019/02/13 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
制药工程专业毕业生推荐信
2013/12/24 职场文书
生产操作工岗位职责
2014/09/16 职场文书
大学生个人学习总结
2015/02/15 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
Python中tkinter的用户登录管理的实现
2021/04/22 Python
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers