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. Java面试题1-附答案

    List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...

  2. 吴裕雄--天生自然python学习笔记:打开文件并显示文件内容

    Win32com 组件打开文件通过 Documents 的 Open 方法,语法为 : 例如,打开上一节创建的 testl . docx 文件 , 文件变量名为 doc: 获得文件内容的方法有两种,第 ...

  3. jquery学习随笔

    转)jquery学习随笔(jquery选择器)   jQuery的选择器是CSS 1-3,XPath的结合物.jQuery提取这二种查询语言最好的部分,融合后创造出了最终的jQuery表达式查询语言. ...

  4. Android7.0 USBCamera设备/dev/video0无读权限

    Android7.0的系统,具备root权限,执行 # adb shell # su # chmod 777 /dev/video0 在5.0的系统中可以预览图像,7.0返回无读权限 File fil ...

  5. 数据库引擎MyiSAM和InnoDB区别

    数据库操作原理归根到底还是对文件操作,只不过是数据库文件. MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三 ...

  6. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-openpyxl读取excel(14)

    从excel中读取数据 # -*- coding: utf-8 -*- # @Time : 2020/2/12 17:23 # @File : do_excel_openpyxl_14.py # @A ...

  7. SQL提高性能

    1.对外键建立索引,大数据量时性能提高明显(建索引可以直接[Merge Join],否则还须在查询时生成HASH表作[Hash Join]) 2.尽量少使用inner join,使用left join ...

  8. 吴裕雄--天生自然 R语言开发学习:图形初阶

    # ----------------------------------------------------# # R in Action (2nd ed): Chapter 3 # # Gettin ...

  9. DailyRollingFileAppender-设置文件大小和备份天数

    感谢:http://byx5185.iteye.com/blog/1616034 1.重写FileAppender : package com.bankht.cis.tps.apps.tps.util ...

  10. Java ERROR JDWP Unable to get JNI 1.2 environment, jvm

    Java: ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 DWP exit erro ...