在koa2使用了其他模块,是异步的方法,把他用改成了promise函数,结果出了问题
import Koa from "koa";
import Router from "koa-router";
import request from "request";
import supertest from "supertest";
const app = new Koa();
const router = new Router();
const client = supertest.agent(app.listen(3000));
router
.get("/send", async (ctx, next)=> {
let params = {...}
let aa = await Prequest(params);
console.log(aa);//不打印
ctx.status = 200;
})
app
.use(router.routes())
.use(router.allowedMethods());
//测试错误 超时了
describe("test", function () {
this.timeout(10000);
it("send", function (done) {
client
.get('/send')
.expect(200,done)
});
})
function Prequest(params) {
return new Promise(function (resolve, reject) {
request(params, function (error, response, body){
if (error || !body || body.code != 1) {
reject(error);
}
resolve(body);//并没有resolve出去
})
});
}
@hyj1991 还真是 进reject了。。。 但是为什么调用了reject后,却继续往下执行了resolve,这也就是为什么我说没有resolve出去。按理说不该说reject了就结束了吗?而且里面的错误也是null 大概是这样 ---------reject null ---------resolve {“msg”:“成功”}
router
.get("/send", async (ctx, next)=> {
try{
let params = {...}
let aa = await Prequest(params);
console.log(aa);//不打印
ctx.status = 200;
}catch(e){
console.error(e);
}
});
加一个try catch看看,因为走到了reject,所以let aa = await Prequest(params);下面不执行是正确的哇,因为相当于Promise调用链出现了异常 至于error是null,很简单哇,你是判断
if (error || !body || body.code != 1)
只要满足这个if就reject,这个if又是用了||, 那有可能是body为空,或者body.code != 1,进入了这个判断 此时error是null也是很正常的,你可以
if (error || !body || body.code != 1) {
let errObj = {};
errObj.error = error;
errObj.body = body;
errObj.code = body.code;
reject(errObj);
}
这样就保证走到reject有error返回 实际上,你一开始reject(error)里面的error,只是request出现类似ECONNRESET等socket错误或者传参异常导致的error,但是你又设置给自己获取的参数做了异常判断,即你认为就算request请求成功了,但是获取到的body为空,或者body.code != 1都是异常,所以光打印reject(error)当然不行了 建议lz先去看下ES6的Promise的api文档,理解下Promise的流程~