承诺完成后发送服务器响应

时间:2020-01-01 16:47:21

标签: javascript express

我有一个简单的快速服务器,该服务器正在运行一个循环,检查数组中的每个域。.现在,我将所有结果推入数组的每个results语句的数组.then中诺言。在此承诺块完成后,如何在 之后发送服务器响应中的results?在承诺后是否应该使用res.send(results)运行回调?还是有一种方法可以从.finally的承诺中做到这一点?还是应该使用express next参数?我不确定该怎么做。

const whois = require('whois-info');
const express = require('express');
const app = express();

app.get('/domainfinder/domain/:domainURL', (req, res) => {
  //const domainURLs = req.params.domainURLs;

  let tests = ['google.com', 'nomatchdomain.com', 'notfounddomain.me'];

  let results = [];

  [...tests].forEach(domain => {
    whois.lookup(domain)
      .then(data => results.push(data))
      .catch(e => console.log(domain, e.message))
  });

  res.send(results);
});

app.listen(3000, () => console.log('App listening on port 3000!'));

2 个答案:

答案 0 :(得分:3)

如果发生错误,您必须调用next(err),并在res.send(results)回调中调用then

const whois = require('whois-info');
const express = require('express');
const app = express();

app.get('/domainfinder/domain/:domainURL', (req, res) => {
  //const domainURLs = req.params.domainURLs;

  let tests = ['google.com', 'nomatchdomain.com', 'notfounddomain.me'];

  Promise.all(tests.map(domain => whois.lookup(domain)))
      .then(results => res.send(results))
      .catch(e => next(e))
  });
});

app.listen(3000, () => console.log('App listening on port 3000!'));

答案 1 :(得分:2)

三个选项:

使用async / await(一个接一个地执行查找):

const whois = require('whois-info');
const express = require('express');
const app = express();

app.get('/domainfinder/domain/:domainURL', async (req, res) => {
  //const domainURLs = req.params.domainURLs;

  let tests = ['google.com', 'nomatchdomain.com', 'notfounddomain.me'];

  try {
    let results = [];

    for (const domain of tests) {
      results.push(await whois.lookup(domain));
    }

    res.send(results);
  } catch (e) {
    // handle error
  }
});

app.listen(3000, () => console.log('App listening on port 3000!'));

使用Promise.all(一次执行所有查找):

const whois = require('whois-info');
const express = require('express');
const app = express();

app.get('/domainfinder/domain/:domainURL', (req, res) => {
  //const domainURLs = req.params.domainURLs;

  let tests = ['google.com', 'nomatchdomain.com', 'notfounddomain.me'];

  Promise
    .all(tests.map(domain => whois.lookup(domain)))
    .then(results => res.send(results)
    .catch(e => { /* handle error */ });
});

app.listen(3000, () => console.log('App listening on port 3000!'));

使用reduce(一个接一个地执行查找):

const whois = require('whois-info');
const express = require('express');
const app = express();

app.get('/domainfinder/domain/:domainURL', (req, res) => {
  //const domainURLs = req.params.domainURLs;

  let tests = ['google.com', 'nomatchdomain.com', 'notfounddomain.me'];

  tests.reduce(
    (p, domain) =>
      p.then(results => whois.lookup(domain).then(data => [...results, data])),
    Promise.resolve([])
  )
  .then(results => res.send(results))
  .catch(e => { /* handle error */ });
});

app.listen(3000, () => console.log('App listening on port 3000!'));
相关问题