KOA2+node+ejs Error: Can't set headers after they are sent.

新手上路,请多包涵

用 KOA2 + nodejs + ejs 抓取网页数据,且在前端页面显示出结果信息:

query.js

const superagent = require('superagent');
const charset = require('superagent-charset');
const cheerio = require('cheerio');

charset(superagent);

function Rate(from, to, queryNumber) {
    this.from = from;
    this.to = to;
    this.queryNumber = queryNumber;
}

module.exports = Rate;

Rate.query = function query(rate, callback) {
    let URL = 'http://qq.ip138.com/hl.asp?from=' + rate.from + '&to=' + rate.to + '&q=' + rate.queryNumber;
    superagent.get(URL)
       .charset('gbk')
       .end((err, sres)=> {
          if (err) {
              return next(err);
          }
          var $ = cheerio.load(sres.text);
          var queryResult = [];
          queryResult[0] = $(".rate td").eq(4).text();
          queryResult[1] = $(".rate td").eq(5).text();
          callback(null, queryResult);

       })
};

index.js

const index = require('koa-router')();
const Rate = require('../models/query');

index.get('/s*', async (ctx, next) => {
    let rate = new Rate(ctx.query.from, ctx.query.to, ctx.query.queryNumber);
    await Rate.query(rate, (err, queryResult) => {
      if (err) {
         return next(err);
      } else {
         return ctx.render('query', {
                   title: '查询结果',
                   rate: queryResult[0],
                   amount: queryResult[1]
      });
      return next();
      }

    });

在访问“/s*”页面时,出现:(node:808) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Can't set headers after they are sent.错误,且页面无法跳转。

试了很多方式,但还是不知道应该在哪里提前返回。

目前已知道,是因为在ctx已经结束之后,又去调用render去写数据。。。但就是找不到该在哪里改。。。求助各位。。

阅读 3.7k
1 个回答

你的await后面跟的函数都不是async函数
写了await为什么还要搞回调呢
await就是为了解决回调函数嵌套问题而设计的
你这写的真是乱糟糟的
先把 async await promise 搞明白了再写吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题