本地部署http-server/node server | 青训营笔记

168 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天。
使用平台:git for windows, chorme, vscode(win端) ,node, express, http

1.本地部署初试

为了为做好大作业项目作准备,我找到了一份前端项目源码,打算阅读分析一下,但是这份源码的输出日志是发送到云端服务器上的。为了方便本地浏览器查看与调试,以及减少同源策略限制的影响,我打算将这份代码通过http-server部署到本地。 http-server是一个npm包,可以部署一个本地访问的简单服务器。

下载git for windows,并在git bash中执行:

npm install http-server 

就可以使用这个包了。 既然http-server部署后,依然是通过浏览器访问,那么script标签中的 type="module" 亦是必不可少的,不然如上篇笔记所演示的,引入模块的代码依旧会出错。

在git bash输入:

http-server -c-1

即可启动bash所在目录的index.html的服务,并且禁用缓存。在浏览器输入127.0.0.1:8080就可以查看部署的网页内容了

2.发现问题

虽然还是出现了一些报错,不过比较简单的问题我还是可以兵来将挡水来土掩的,毕竟大部分问题都是由于js版本更新一些旧的书写形式在一般模式下不支持了。在修改了几行代码后,我自信满满地退出重启http-server服务,但是同样的报错又出现了。

在代码间反复横跳并纠结了一段时间后,我发现我在-c-1中间多加了一个空格(实际上这是一个参数,cachecontrol负一),导致缓存没有被及时清理,浏览器还是用了之前的代码,报错也被保留了下来...在发现是这个参数写错了之前,我手动清除了浏览器缓存,是有效的,也侧面说明了这个坑的产生原理。

代码部署到本地后,还需要一个server与代码进行通信,处理它所发送的日志信息,后期这个server也会作为监控平台的本体,展示监控信息。结合青训营课程所学的node写httpserver的内容,与我所查找到的资料,我使用了这个异步node代码:

需要express和http组件,path和assert的引入可以编译器自动进行

const { response } = require('express') 
const http = require('http'); 
const { resolve } = require('path'); 
const { rejects } = require('assert'); 

创建一个server实例,在监听到请求时异步执行代码 (不使用异步执行代码的话,客户端-即我之前部署在http-server的代码会报错无法连接服务器。我猜测是不异步执行的话,对msg的处理只会进行一次,于是只显示了默认的hello,导致正式请求无法执行)

const server = http.createServer(async (req, res) => { 
    const msg = await new Promise((resolve, reject) => { 
        const bufs = [] 
        req.on('data', (buf) => { bufs.push(buf) }) 
        req.on('error', (err) => { reject(err) }) 
        req.on('end', () => { 
            const buf = Buffer.concat(bufs).toString('utf-8') 
            let msg = 'hello' 
            try { 
                const ret = JSON.parse(buf) 
                msg = ret.msg 
                } catch (err) {} 
        resolve(msg) // console.log('msg received: ', msg) 
        })
    }) 
const responseJson = { msg: `receive: ${msg}` } 
res.setHeader('Content-Type', 'application/json') 

3.尝试解决

在浏览器检查工具中的网络信息显示中,我发现预检信息可以成功发送到服务器,但是请求无法被响应。检查报错发现是CORS问题导致正式请求被拒绝。这里加上这两行代码之后,请求就可以顺利进行了。代码的作用是在请求头中设置允许跨域请求,因为我的服务器和客户端分别运行在不同的端口上(客户端在http-server默认端口8080),触发了同源策略保护,所以需要特别设置一下。

res.setHeader('Access-Control-Allow-Origin', '*') 
res.setHeader('Access-Control-Allow-Methods', 'GET,POST') 

返回已经收到的信息,方便查看。

res.end(JSON.stringify(responseJson)) })

设置服务器监听本地的3000端口。端口尽量设置成与其他服务不冲突的。

const port = 3000 

设置服务器监听事件。

server.listen(port, () => { console.log('listening on: ', port) })

代码写好后,在文件夹位置调出git bash,输入node 文件名称.js即可运行

4.其他方法

在之后查找资料的过程中,我了解到引用cors包也可以解决跨域问题。但是cors包中,cors函数传入的参数不能是httpserver实例,在这里就不适用了。