koa进阶史(一)
1,设置静态文件目录,将__dirname 写成_dirname,乍看没什么毛病,但是一运行之后发现,_dirname is not defined,下次注意哈
const bodyParser = require('koa-bodyparser');
app.use(bodyParser());
需要注意的是:该middleware的顺序很重要,必须在router之前被注册到app对象上。至此就拿到了这个ctx.request.body对象,就是我们的请求数据。
router
.get('/', pages.schedule)
.get('/schedule', pages.schedule)
.post('/schedule/getMeetingList/byWorkAndDate',function(ctx, next){
let param = ctx.request.body;
console.log('请求体===》',param)
return new Promise((resolve,reject) => {
request.post({
url: byWorkAndDate,
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
body: JSON.stringify(param)
},function(error,response,body){
//重定向
if(!error && response.statusCode == 302){
ctx.response.status = 302;
console.log("返回的response===>",response.headers)
ctx.response.header = response.headers;
ctx.response.body= null;
console.log('ctx的设置是===》',ctx);
let loc = response.headers.location;
ctx.redirect('back',loc);
} if (!error && response.statusCode == 200) {
ctx.body = res.body;
}
resolve()
});
})
})
4,但是重定向未跳转成功,上面的3又进行了重组,我以为问题都搞定了呢,其实没有,在设置response.header的时候那种写法是错误的,正确的写法是:
res.set(fields):使用对象同时设置 response header 中多个字段的值。
ctx.set({
'Etag': '1234',
'Last-Modified': date
});
代码如下:
router
.get('/', pages.schedule)
.get('/schedule', pages.schedule)
.post('/schedule/getMeetingList/byWorkAndDate',async (ctx, next)=>{
let param = ctx.request.body;
await requestData(byWorkAndDate,param).then(result=>{
if(result[0] == 302){
ctx.status = 302;
ctx.set(result[1]);
ctx.set({
"Referer":result[1].location
})
ctx.response.redirect(result[1].location);
}
console.log('ctx==>',ctx);
});
await next();
})
上面的requestData是用request进行后台请求接口数据的方法,然后resolve了两个参数,一个是statusCode,另外一个302时候是response.header,如果200就返回response.body。
{
request: {
method: 'POST',
url: '/schedule/getMeetingList/byWorkAndDate',
header: {
host: 'localhost:3000',
connection: 'keep-alive',
'content-length': '81',
accept: '*/*',
origin: 'http://localhost:3000',
'x-requested-with': 'XMLHttpRequest',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'content-type': 'application/json;charset=UTF-8',
referer: 'http://localhost:3000/',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
cookie: 'ESG_SFIM_SMS_SZ22_APP=ESG_SFIM_SMS_SZ22_JT_112_6'
}
},
response: {
status: 302,
message: 'Found',
header: {
location: 'http://cas.sit.sf-express.com/cas/login?service=http://sfim-sms-bg.sit.sf-express.com/schedule/getMeetingList/byWorkAndDate',
'content-length': '301',
server: 'Jetty(9.2.7.v20150116)',
'set-cookie': [Array],
connection: 'close',
via: '1.1 ID-0002262062176300 uproxy-7',
referer: 'http://cas.sit.sf-express.com/cas/login?service=http://sfim-sms-bg.sit.sf-express.com/schedule/getMeetingList/byWorkAndDate',
'content-type': 'text/html; charset=utf-8'
}
},
app: {
subdomainOffset: 2,
proxy: false,
env: 'development'
},
originalUrl: '/schedule/getMeetingList/byWorkAndDate',
req: '<original node req>',
res: '<original node res>',
socket: '<original node socket>'
}
可以看出ctx.response是彻底被赋值成功,而且status是302,里面的location是正常的跳转链接。但是response.header里面加了Referer跳转仍然不成功;正在解决中。
5,重定向的问题是解决了,因为前端是ajax进行接口请求的,所以在status是302的时候,node中间层进行了重置,仍然statusCode返回200,但是ctx.body里面的返回是:
redirectUrl = result[1].location.split('?')[0]+'?service=http://localhost:3000';
ctx.body={status:302,location:redirectUrl}
在前端拿到返回的数据后,先判断status的状态,如果是302则进行location的跳转,所以重定向是在前端做的。
目前node中间层开发过程中遇到的问题就是CAS认证通不过,所以日程项目的改造经过一周的时间以失败告终,因为SIT环境的CAS不支持本地服务的认证。
但是在开发过程中我进行了项目结构的模块化:
app.js 主要用来进行服务的启动,中间件的引入。
router.js 主路由
routerMap.js 路由信息
server.js 后台接口信息
koa进阶史(一)的更多相关文章
- koa进阶史(二)
之前想着放弃CAS的验证吧,但是又去请教了一个大牛,了解到sf公司的CAS验证校验的参数不是sessionId而是另外两个,后登陆sit环境偷了两个参数后,后台接口成功返回200.然后node层也就能 ...
- easy-ui 小白进阶史(二):操作数据,easy-ui操作
easy-ui的操作及交互: Html: @using LangBo.Facade; @using LangBo.DataDefine; @using System.Threading.Tasks; ...
- easy-ui 小白进阶史(一):加载数据,easy-ui显示
作为一个没上过大学,没经过正规培训的96年的小白来说,找工作就没报特别大的希望,大不了找不到在回炉重造,继续学... 终于在海投了200份的简历之后...终于找到了...面试也挺简单的,,,第二天就去 ...
- hive启动出错
Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument - 狗子的进阶史 - ...
- [No00004F]史上最全Vim快捷键键位图(入门到进阶)
史上最全Vim快捷键键位重磅来袭!!学习Linux的朋友看过来啦,你是不是觉得Linux编辑器Vim操作复杂,步骤繁琐呢?Linux工程师是不是想大幅度提升自己的工作效率呢? 经典版 下 ...
- [No00004F]史上最全Vim快捷键键位图(入门到进阶)vim常用命令总结
在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format.使 ...
- 20145216史婧瑶《网络对抗》逆向及Bof进阶实践
20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢 ...
- Node.js进阶篇-koa、钩子函数、websocket、嵌入式开发
代码地址如下:http://www.demodashi.com/demo/12932.html 一.简介 koa是由Express原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的We ...
- 史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点
史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点 1
随机推荐
- VBA引用管理加载宏
下载文件: VBA引用管理加载宏.rar 下载后,解压缩. Excel的 开发工具/加载项 在对话框中浏览 VBA引用管理.xlam VBA界面中,在工程右键菜单中出现:
- centos7 ModuleNotFoundError: No module named 'users'
centos7下运行django项目时ModuleNotFoundError: No module named 'users' 由于我的项目目录是下面这样: 因为找不到users的路径 所以在mana ...
- MySQL表与表的关系
表与表的关系 一对多关系 ID name gender dep_name dep_desc 1 Chen male 教学部 教书育人 2 Old flying skin male 外交部 漂泊游荡 3 ...
- spring注入原型bean
<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient" scope= ...
- HTML颜色表
1.配色原则 2.HTML颜色表 颜色名列表 单击一个颜色名或者16进制值,就可以查看与不同文字颜色搭配的背景颜色 3.总参考表:
- django框架基础-框架介绍-长期维护
############### MVC架构介绍 ################ # MVC架构 # 一个软件框架有很多的模块,每一个模块有不同的功能 # 模块与模块之间相互配合来完成软件 ...
- [蓝桥杯2015初赛]方程整数解 unordered_map
unordered_map: 如果直接写报错加上tr1: #include<tr1/unordered_map>//注意写法 using namespace std; using name ...
- leaflet本地加载arcgis切片
var origin = [-20037700, 33711400];//图层起点坐标 var resolutions = [ 8466.6836000338681, // Level 0 4233. ...
- file,path,uri互相转换
uri 转 file :File file = new File(new URI(uri.toString())); uri 转 path: Path path = Files.get(uri); f ...
- webpack中使用ECharts
npm安装ECharts 引入ECharts 通过 npm 上安装的 ECharts 和 zrender 会放在node_modules目录下.可以直接在项目代码中 require('echarts' ...