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