我有一个简单的快速服务器,该服务器正在运行一个循环,检查数组中的每个域。.现在,我将所有结果推入数组的每个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!'));
答案 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!'));