首页 > 开发 > NodeJS > 正文

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

2017-09-08 17:13:16  来源:网友分享

用 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 搞明白了再写吧