当前位置:首页 > nodejs做中间层,转发请求

nodejs做中间层,转发请求

发布于 2018-04-11 阅读 8802 次 NodeJs

简述node中间层的优势

node中间层,可以解决前端的跨域问题,因为服务器端的请求是不涉及跨域的,跨域是浏览器的同源策略导致的,关于跨域可以查看跨域复习
使用node坐中间层,方便前后端分离,后端只需要提供数据接口,不必关心前端业务逻辑的实现。
通过node中间层前端可以将数据再次整合扩展,使用自己的数据结构render渲染页面。

1.安装node环境,网上很多教程,大家可以自行百度

2.安装express

  1. npm i express -g --save-dev

3.安装express-generator

  1. $ npm install express-generator -g --save

express-generator可以帮我们生成一个目录结构。

执行:

  1. express myproject

后,生成目录结构。
在这里我发现一个小坑,就是配置模板引擎的时候,假如我们不想用jade

  1. /*引用模板引擎*/
  2. var template = require('art-template');
  3. var express_template = require('express-art-template');
  4. // view engine setup
  5. app.set('views', path.join(__dirname, 'views'));
  6. app.engine('html', express_template);
  7. app.set('view engine', 'html');

这是我配置模板的配置文件中的截取,已使用腾讯的art-template为例子,app.engine(‘html’, express_template);将模板引擎绑定到views目录下的html文件,app.set(‘view engine’, ‘html’);设置模板引擎。这里大家可以参考express的官方文档,说明的很清楚。

使用request请求php服务器:
request不是node的核心模块,首先我们需要安装它,关于request,可以参考我的另一篇文章:npm-request或者去到npm官网有更详尽的介绍。

  1. npm i request --save-dev

服务器端转发请求的代码:

  1. var request = require('request');
  2. /* GET home page. */
  3. router.get('/', function(req, res, next) {
  4. // 请求地址http://127.0.0.1/~haha/interf/a.php
  5. request('http://127.0.0.1/~haha/interf/a.php',function(error,response,body){
  6. /*判断请求是否成功*/
  7. if (!error && response.statusCode == 200) {
  8. /*把字符串转换为json*/
  9. var data=JSON.parse(body);
  10. /*渲染模板*/
  11. res.render('index', data);
  12. }
  13. });
  14. });

如果不想使用request模块,我们也可以使用node的内置模块http:

  1. var http = require('http');
  2. router.get('/post', function(req, res) {
  3. const postData=querystring.stringify({
  4. 'msg' : 'Hello World!'
  5. });
  6. var opt = {
  7. hostname:'127.0.0.1',
  8. path:'/~donghao/interf/a.php',
  9. method:'POST',
  10. headers:{
  11. 'Content-Type' : 'application/x-www-form-urlencoded',// 不写这个参数,后台会接收不到数据
  12. 'Content-Length' : postData.length
  13. }
  14. }
  15. const request = http.request(opt,function (response) {
  16. console.log('STATUS:' + response.statusCode);
  17. console.log('HEADERS:' + JSON.stringify(response.headers));
  18. var renderData = ''
  19. response.setEncoding('utf8');
  20. response.on('data',function(body){
  21. renderData+=body;
  22. });
  23. response.on('end',function(){
  24. //请求结束
  25. console.log('end');
  26. res.render('index',JSON.parse(renderData));
  27. });
  28. response.on('error',function(e){
  29. if(e){
  30. console.log(e);
  31. }
  32. })
  33. });
  34. //post方法里
  35. request.on('error', function(e) {
  36. console.error('请求遇到问题:'+ e.message);
  37. });
  38. request.write(postData,'utf-8');
  39. request.end();
  40. });