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