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
随机推荐
- 在Python 中怎么表示一个元素在一个list中的数量?
commonest = [1,2,2,2,1,3,4,5,1,1] print(commonest.count(1))
- python实现使用代码进行代理配置
#!/usr/local/bin/python3.7 import urllib.request import urllib.parse # 创建handler handler = urllib.re ...
- 1、简述在java网络编程中,服务端程序与客户端程序的具体开发步骤?
网络编程分为UDP通信和TCP通信 UDP协议: 发送端:1.创建DatagramSocket对象.2.创建DatagramPacket对象,并封装数据.3.发送数据.4.释放 资源. 接收端:1.创 ...
- Linux挂载存储(供应商给的资料)
infofile iqn.1994-05.com.redhat:16a2b8b7d8 infodb iqn.1994-05.com.redhat:8518efa2fe72 在iscsi server上 ...
- 95)PHP,文件上传知识和代码
首先是知识总结: 上传: 从浏览器端传输的到服务器端. 请求时: 数据从浏览器端传输到服务器端. 可见: 上传,发生在浏览器向服务器发出请求过程中. 文件,对于浏览器来讲,就是表单中的一个特殊类型的数 ...
- UFT检查点
一.标准检查点 选择需要插入检查点的语句,点击右键,选择Insert Standard Checkpoint.... 二.图像检查点(Insert Standard Checkpoint....) 在 ...
- python后端面试第三部分:数据储存与缓存相关--长期维护
1. 列举常见的关系型数据库和非关系型都有哪些?2. MySQL常见数据库引擎及比较?3. 简述数据三大范式?4. 什么是事务?MySQL如何支持事务?5. 简述数据库设计中一对多和多对多的应用场景? ...
- ofo小黄车推出车身商业化广告,能自救成功吗?
ofo终于还是扛不住了!作为之前与摩拜相抗衡的巨头,ofo其实也是最被看好的共享单车企业之一.可惜共享单车行业的窘境,终究不是成为巨头后就能拯救的.摩拜被美团收购后,ofo就成为巨头垂涎的目标.数十亿 ...
- if分支判断
# 控制语句 分支 循环语句 # 判断语句 if ..elif..else # if 条件语句(比较 逻辑 成员运算) # 空数据 == False # 非空数据 == True age = 20 i ...
- java 通过数据库名获得 该数据所有的表名以及字段名、字段类型
package com.nf.lc.sql_meta_data; import java.sql.*; import java.util.HashMap; import java.util.Map; ...