1,设置静态文件目录,将__dirname 写成_dirname,乍看没什么毛病,但是一运行之后发现,_dirname is not defined,下次注意哈

app.use(express.static(__dirname + '/public'));
该__dirname是node的一个全局变量,表示当前模块的文件夹名称。
相对的__filename,当前模块的文件名称---解析后的绝对路径。
app.use(serve(path.join(__dirname, 'public/src')));path.join是用于两个文件夹路径的拼接,path.resolve类似于linux命令的cd。
 
2,用koa-router进行post请求时候拿不到请求数据,原来,koa用post请求URL时,post会发送表单或者json,作为request的body发送,node还是koa的request对象都不提供解析request的body对象,必须用中间件进行解析。koa提供了koa-parser中间件进行解析原始的request对象。
const bodyParser = require('koa-bodyparser');
app.use(bodyParser());

需要注意的是:该middleware的顺序很重要,必须在router之前被注册到app对象上。至此就拿到了这个ctx.request.body对象,就是我们的请求数据。

 3,说个比较傻傻的问题,昨天是用node的request获取后台接口,返回是有了,但是因为后台接口要过cas校验,也就是要登录域账号,如果后台接口的status是302,就要重定向到相应的location,刚刚解决了这个问题,至此在记录下。
(1)在node中间层我未能够转发服务成功的原因是:koa是基于promise的,express是基于回调的,所以我在进行request方法调用的时候,需要返回一个promise对象。
(2)ctx.response的赋值是成功了,但是服务一直pending,一直以为是因为ctx.end(),PS:ctx是没有end的方法的。真是是因为我的promise没有resolve或者reject,所以接口一直处于pending状态,也就是promise的pending状态,promise的中断是需要进行resolve或者reject的。 
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进阶史(一)的更多相关文章

  1. koa进阶史(二)

    之前想着放弃CAS的验证吧,但是又去请教了一个大牛,了解到sf公司的CAS验证校验的参数不是sessionId而是另外两个,后登陆sit环境偷了两个参数后,后台接口成功返回200.然后node层也就能 ...

  2. easy-ui 小白进阶史(二):操作数据,easy-ui操作

    easy-ui的操作及交互: Html: @using LangBo.Facade; @using LangBo.DataDefine; @using System.Threading.Tasks; ...

  3. easy-ui 小白进阶史(一):加载数据,easy-ui显示

    作为一个没上过大学,没经过正规培训的96年的小白来说,找工作就没报特别大的希望,大不了找不到在回炉重造,继续学... 终于在海投了200份的简历之后...终于找到了...面试也挺简单的,,,第二天就去 ...

  4. hive启动出错

    Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument - 狗子的进阶史 - ...

  5. [No00004F]史上最全Vim快捷键键位图(入门到进阶)

    史上最全Vim快捷键键位重磅来袭!!学习Linux的朋友看过来啦,你是不是觉得Linux编辑器Vim操作复杂,步骤繁琐呢?Linux工程师是不是想大幅度提升自己的工作效率呢? 经典版        下 ...

  6. [No00004F]史上最全Vim快捷键键位图(入门到进阶)vim常用命令总结

    在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format.使 ...

  7. 20145216史婧瑶《网络对抗》逆向及Bof进阶实践

    20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢 ...

  8. Node.js进阶篇-koa、钩子函数、websocket、嵌入式开发

    代码地址如下:http://www.demodashi.com/demo/12932.html 一.简介     koa是由Express原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的We ...

  9. 史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点

    史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点 1

随机推荐

  1. 堆排Heap Sort

    1. #define LeftChild(i) (2*(i)+1) void PercDown(vector<int>&num, int i, int n) { int child ...

  2. python之time模块和hashlib模块

    一.time模块 import time print(time.strftime('%Y-%m-%d %H:%M:%S'))#获取当前的格式化时间,time.strftime(format) prin ...

  3. android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码

    Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...

  4. mysql 优化2 慢查询

    默认情况下mysql不记录慢查询日志,需要在启动的时候指定 bin\mysqld.exe - -slow-query-log 通过慢查询日志定位执行效率较低的SQL语句.慢查询日志记录了所有执行时间超 ...

  5. Linux Ubuntu 默认root密码

    Ubuntu 默认root密码是随机的,每次开机都会有一个新的root密码 第一步: 输入命令:sudo passwd

  6. Flash Builder 使用

    1. 解决编译慢的问题:用记事本打开安装目录下的 FlashBuilder.ini ,将里面设置的容量都扩大一半,如-Xms256m改为 -Xms512m,另外几项类似修改: 定位到相应版本的sdks ...

  7. 途牛与十八好汉撕X又言和 到底想干啥?

    到底想干啥?" title="途牛与十八好汉撕X又言和 到底想干啥?"> 天下大势,合久必分,分久必合.很多看起来热闹哄哄的"劳燕分飞"事件,最 ...

  8. html中的锚点介绍和使用

    以下资料整理自网路 1.锚点是网页制作中超级链接的一种,又叫命名锚记.命名锚记像一个迅速定位器一样是一种页面内的超级链接,运用相当普遍. 英文名:anchor 使用命名锚记可以在文档中设置标记,这些标 ...

  9. 当学术邂逅浪漫 – 记MobiCom 2015大会

    作者:微软亚洲研究院主管研究员 刘云新 今年的MobiCom大会在著名的浪漫之都巴黎举行.通常于欧洲举办的会议的参会人数会相对少一些,但今年的MobiCom大会吸引了近400人参加,绝不少于往年.浪漫 ...

  10. 码海拾遗:简述C++(一)

    C++是Bjarne Stroustrup博士于1982年,在C语言的基础上引入并扩充了面向对象的概念后发明的一种新的程序语言.就与C语言的渊源而言,C++可以说是C语言的超集,它兼容C的一切(可能是 ...