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

查看:384
本文介绍了javascript - 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去写数据。。。但就是找不到该在哪里改。。。求助各位。。

解决方案

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

这篇关于javascript - KOA2+node+ejs Error: Can't set headers after they are sent.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆