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. 《C程序设计语言》练习 1-8,1-9

    #include <stdio.h> /*编写一个统计空格,制表符与换行符个数的程序*/ main() { int a,b,c,d;//a表示空格个数,b表示制表符个数,c表示换行符个数 ...

  2. python取出前端传入execl文件中的数据

    from openpyxl import load_workbook #获取前台传入的文件 uploadedFile = request.FILES.get('file') #获取execl文件 wb ...

  3. Docker部署Python爬虫项目

    1) 首先安装docker: # 用 yum 安装并启动 yum install docker -y && systemctl start docker 2) 下载自定义镜像需要用到的 ...

  4. Java Class Loader Retrospect

  5. pycharm中无法调用pip的安装包

    https://blog.csdn.net/sinat_23619409/article/details/79962518 较详细:https://blog.csdn.net/weixin_41287 ...

  6. OpenCV 改变图像的对比度和亮度

    #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ios ...

  7. leetcode第22题:括号生成

    力扣上的题目可以大致分为以下种类: 对某种复杂规则的彻底解析,很有可能要构造状态机,充分考虑边界情况. 对某种数据结构及算法的应用. 对数学概念.遍历.动态规划等的综合应用. 通过分析,本题应该属于1 ...

  8. Docker企业级镜像仓库harbor(vmware 中国团队)

    第一步:安装docker和docker-compose 第二步:下载harbor-offline-installer-v1.3.0.tgz 第三步:上传到/opt,并解压 第四步:修改harbor.c ...

  9. mongodb配置windows服务启动

    第一步 下载MongoDB http://www.mongodb.org/downloads 第二步 解压到D:\mongodb\目录下,为了命令行的方便,可以把D:\mongodb\bin加到系统环 ...

  10. python中字典dic详解-创建,遍历和排序

    原文地址:http://www.bugingcode.com/blog/python_dic_create_sort.html 在python的编程中,字典dic是最典型的数据结构,看看如下对字典的操 ...