安装node

1、Node官网下载pkg安装包,点击安装即可,安装包包含nodejs和npm(node package manager)
2、安装完成后,在命令终端输入

curl http://npmjs.org/install.sh | sh

3、这个npm.js实际上是Node.js的套件管理工具,执行完成之后我们继续执行命令,更新npm:

sudo npm update npm -g

4、查看npm是否安装成功

npm -v

创建node 服务

创建node 服务和web 端通信需要用到http、https
如果访问文件需要用到fs

首先创建一个服务

1、新建一个文件server.js
2、引入对应所需的依赖

var http=require('http');
var https = require('https')
var fs = require('fs');

3、创建http 服务

const server = http.createServer((req, res) => {
    // 这里可以设置header信息, 如跨域等信息
}).listen(8090)

4、启动服务

以上内容即可启动服务,可以通过node 的命令启动服务,默认域名是http://127.0.0.1:8090
即可访问node 服务,可以对创建的服务添加一些监听

对创建的服务监听request请求

request 监听有两个参数,req 请求 和 res 响应
添加监听的方法, 如文件的请求,方法接口的请求

const requestHandle = (req, res) => {
    // 设置一些 请求处理的方法
    if (url === '/index') { // 文件的请求
        res.writeHead(200, {
          'Content-Type': 'text/html'
        })
        fs.readFile('index.html', 'utf8', function (err, data) {
          if (err) throw err
          res.end(data)
        })
     } else if (url === '/api') { // 接口请求
        req.on('data', function (pamas) {
          console.log('8888888')
          // 在此做一些数据的处理
        })
        req.on('end', () => {
            // 请求结束
        })
    } else { // 404 请求
        res.write('404')
        res.end()
   }
}

添加监听

server.on('request', requestHandle)

console.log 的内容均在服务终端上会展示出来

node服务请求其他服务

以钉钉报警为例,由于前端不支持直接请求钉钉报警接口,需要通过服务来转发请求,便有了如下例子

const dingdingHandle = (str, callback) => {
// 钉钉报警传参
  const postData = {
    msgtype: "text",
    text: {
      content: str
    },
    "at": {
      "atMobiles": [
          "155********"
      ], 
      "isAtAll": false
    }
  };

  const options = {
    hostname: 'oapi.dingtalk.com',
    path: '/robot/send?access_token=d529ae67dcc82157032c3c84bad0c450a2329692adca0e00000efcbddf2898',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json;charset=UTF-8',
    }
  };

  const req = https.request(options, (res) => {
    console.log(`状态码: ${res.statusCode}`);
    console.log(`响应头: ${JSON.stringify(res.headers)}`);
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      console.log(`响应主体: ${chunk}`);
      callback(chunk)
    });
    res.on('end', () => {
      console.log('响应中已无数据。');
    });
  });

  req.on('error', (e) => {
    console.error(`请求遇到问题: ${e.message}`);
  });

  // 写入数据到请求主体
  req.write(JSON.stringify(postData));
  req.end();
}

这个方法在接收到对应的请求时调用
在服务端request 监听的回调中对应的接口中调用

...
 } else if (url === '/api') { // 接口请求
   req.on('data', function (params) {
      console.log('8888888')
      // 请求钉钉报警接口,并将响应返回的参数推到前端页面的请求中
      dingdingHandle(params.toString, (data) => {
          res.end(data)
      })
    })
    req.on('end', () => {
        // 请求结束
    })
} else { // 404 请求
...

前端页面接口请求

前端页面请求,业务场景是页面报错时监听

 window.onerror = function (msg, url, line, column, error) {
      let data = {
        msg: msg, 
        url: url, 
        line: line, 
        col: column
      }
      console.log(data, '--------------');
      let xhr = new XMLHttpRequest()
      // xhr.withCredentials = true
      xhr.open('POST', 'http://127.0.0.1:8090/api', true)
      xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
      xhr.send(JSON.stringify(data))
      xhr.onreadystatechange = function () {
        xhr.readyState === 4 && xhr.status === 200 && console.log('ok', xhr.responseText)
      }
    }

跨域

当前前端页面的服务为http://127.0.0.1:8080/,和node 服务存在跨域,此时需要在创建服务的时候,添加header 设置

const server = http.createServer(function(req,res) {
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Oring', 'http://127.0.0.1:8080/')
  res.setHeader('Access-Control-Allow-Credentials', true)
}).listen(8090);
注意:
如果是vue 项目中的axios, 需要手动设置header 以及强转化传输的数据
import axios from 'axios'
import qs from 'qs'
axios({
    method: 'post',
    url: 'http://127.0.0.1:8090/api',
    data: errorData,
    withCredentials: false,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    transformRequest: [sdata => { // 强转数据格式
      console.log(sdata, qs.stringify(sdata))
      return qs.stringify(sdata)
    }]
  }).then(res => {
    console.log('res=>', res) 
  })

芊芊
10 声望0 粉丝

沉迷于代码ing...