我正在使用Node(Express)从列表中搜索URL来编写一些小工具。问题是访问forEach循环中请求回调函数的外部结果。请帮忙 - 为什么结果数组在请求外是空的?我希望将此结果导出到视图中。此外,在请求中定义的任何变量都不是从外部定义的。 这是我的代码:
var express = require('express');
var request = require('request');
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false });
var fs = require("fs");
var app = express();
app.get('/scrap/',function(req,res){
res.render('start.ejs');
});
app.post('/scrap/result', urlencodedParser, function(req,res){
var lista = req.body.lista;
var phrase = req.body.phrase;
var l = lista.split('\n');
var results = []; // declaring results array
l.forEach(function(elem) {
request(elem, function(error, response, html) {
try {
if (html.indexOf(phrase) > 0) {
var result = 'Phrase "' + phrase + '" found';
}
else {
var result = 'Phrase "' + phrase + '" not found';
}
}
catch(err) {
var result = 'Error: '+ err.message;
}
results.push(result);
console.log(results) // here results array is filled with result
});
console.log(results); // results array is empty
});
console.log(results); // results array is also empty
res.render('result.ejs', {
result : results[0],
phrase : phrase,
});
});
app.use(function(req, res, next){
res.redirect('/scrap');
});
app.listen(3000);
答案 0 :(得分:0)
而不是forEach使用map,并返回一个promises数组,然后在提供响应之前对所有这些进行qait。
var responsePromises = l.map(geturslResponsePromise)
q.all(responsePromises).then(function(results){
res.render('result.ejs', {
result : results[0],
phrase : phrase,
});
})
geturslResponsePromise在某种程度上是效果
var geturslResponsePromise = function(elem) {
return new Promise(function(resolve, reject){
request(elem, function(error, response, html) {
try {
if (html.indexOf(phrase) > 0) {
resolve('Phrase "' + phrase + '" found');
}
else {
resolve('Phrase "' + phrase + '" not found');
}
}
catch(err) {
reject('Error: '+ err.message);
}
}) // request
}) // promise
}
注意:未经测试的代码,可能是大量的错误,但这是我采用基于ES5语法的方法
note2:我还建议使用更有意义的变量名。诸如Request,Responses,Url,Uri之类的东西在网络空间中是众所周知和理解的