从异步函数获取数据

时间:2018-11-22 23:04:39

标签: javascript node.js api web

我正在尝试为我的种子箱创建一个像镰刀一样的小网站: 我想要一个搜索表单,它将使用以下api将搜索查询发送给我的种子提供商:https://github.com/JimmyLaurent/torrent-search-api

我设法从表单获取文本,进行api调用并在控制台中打印结果。

但是当我尝试将它们传递到即将成为结果的页面时,我只是传递了诺言,而我不太了解诺言的原理。

如果有人可以帮助我解决我的问题,我将不胜感激,或者至少会给我一些提示!

这是我的代码,由几个ejs,nodejs入门教程组成:

const express = require('express');
const bodyParser = require('body-parser');
const app = express()
const TorrentSearchApi = require('torrent-search-api');
const tableify = require('tableify');
TorrentSearchApi.enableProvider('Yggtorrent','Login', 'Password');

app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: true }));
app.set('view engine', 'ejs')

async function search(query){ // Search for torrents using the api

var string = query.toLowerCase();
//console.log(string);
const torrents = await TorrentSearchApi.search(string,'All',20); // Search for legal linux distros 
return(JSON.stringify(torrents));
}

app.get('/', function (req, res) {
  res.render('index');
})

app.post('/', function (req, res) {
var rawTorrent = search(req.body.torrent);
var page = tableify(rawTorrent); //printing rawtorrent will only give me "promise"
res.render('results',page);
})


app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

1 个答案:

答案 0 :(得分:3)

您的搜索功能正在使用async / await。 这意味着搜索功能是异步的,并返回Promise。 您应该等待其结果(第23行)。

https://javascript.info/async-await

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const TorrentSearchApi = require('torrent-search-api')
const tableify = require('tableify')

TorrentSearchApi.enableProvider('Yggtorrent','Login', 'Password')

app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: true }))
app.set('view engine', 'ejs')


const search = async query => {
  const loweredQuery = query.toLowerCase()
  const torrents = await TorrentSearchApi.search(loweredQuery, 'All', 20)
  return JSON.stringify(torrents)
}

app.get('/', (_, res) => res.render('index'))

app.post('/', async (req, res) => {
  const torrents = await search(req.body.torrent) // Right here
  const htmlTable = tableify(torrents)
  res.render('results', htmlTable)
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})