老师,你好,请教你一个关于将koa升级到2.x的问题,就是升级后,按照老师的方法去获取数据出现500错误,报错原因截图如下:

来源:10-5 为网站添加接口之线上HTTP接口调用

jiafu

2017-08-20

老师,你好,请教你一个关于将koa升级到2.x的问题,就是升级后,按照老师的方法去获取数据出现500错误,报错原因截图如下:,但在去掉return function(cb) {}这个外函数时,相关数据是可以拿得到的,请问是什么原因码?


http://szimg.mukewang.com/59996d580001c3c807310351.jpg


exports.get_search_data = function(start, end, keyword) {

   //返回一个异步函数,当接收回调时,返回数据

   return function(cb) {


       const http = require('http');

       // 该模块的作用是把一个object对象,转换为http的查询参数

       const qs = require('querystring');

       let data = {

           s: keyword,

           start: start,

           end: end

       };


       let query_str = qs.stringify(data);


       let options = {

           hostname: 'dushu.xiaomi.com',

           port: 80, //显式指定

           path: '/store/v0/lib/query/onebox?' + query_str,

           method: 'GET'

       };

       //http请求

       const req_obj = http.request(options, (res) => {

           let content = '';

           res.setEncoding('utf8'); //设置返回的数据格式

           res.on('data', (chunk) => {

               // console.log(`响应主体: ${chunk}`);

               content += chunk;

           });


           res.on('end', () => {

               console.log('响应中已无数据。');

               console.log('######## 内容  ########');

               console.log(content);

               console.log('######## 内容 ########');

               cb(null, content); //callback有两个参数err和返回的内容

               // return content;

           });


       });


       //请求错误处理

       req_obj.on('error', (e) => {

           console.error(`请求遇到问题: ${e.message}`);

       });

       // 使用 http.request() 必须总是调用 req.end() 来表明请求的结束,即使没有数据被写入请求主体。

       req_obj.end();

   }

};


写回答

1回答

jiafu

提问者

2017-08-24

问题已自行解决了,还是es6基础不过关啊,原因如下:

正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise的对象


exports.get_search_data = function(start, end, keyword) {
   //返回一个异步函数,当接收回调时,返回数据
   return new Promise(function(resolve, reject) {
       try {
           const http = require('http');
           // 该模块的作用是把一个object对象,转换为http的查询参数
           const qs = require('querystring');
           let data = {
               s: keyword,
               start: start,
               end: end
           };
           let query_str = qs.stringify(data);
           let options = {
               hostname: 'dushu.xiaomi.com',
               port: 80, //显式指定
               path: '/store/v0/lib/query/onebox?' + query_str,
               method: 'GET'
           };
           //http请求
           const req_obj = http.request(options, (_res) => {
               let content = '';
               // let size = 0;
               // let chunks = [];
               _res.setEncoding('utf8'); //设置返回的数据格式
               _res.on('data', (chunk) => {
                   // console.log(`响应主体: ${chunk}`);
                   // size += chunk.length;
                   // chunks.push(chunk);
                   content += chunk;
               });
               _res.on('end', (e) => {
                   // let content = Buffer.concat(chunks, size);
                   console.log('响应中已无数据。');
                   console.log('######## 内容  ########');
                   console.log(content);
                   console.log('######## 内容 ########');
                   resolve(content);
                   // cb(null, content); //callback有两个参数err和返回的内容
               });
           });
           //请求错误处理
           req_obj.on('error', (e) => {
               console.error(`请求遇到问题: ${e.message}`);
           });
           // req_obj.write()
           // 使用 http.request() 必须总是调用 req.end() 来表明请求的结束,即使没有数据被写入请求主体。
           req_obj.end();
       } catch (e) {
           console.log(e);
       }
   });
};


0
0

HTML5独立开发书城Web App

最前沿前端技术精讲, HTML5 、Vue.js 、Koa 、zepto 综合运用

3387 学习 · 685 问题

查看课程