节点请求函数

时间:2016-06-09 11:47:07

标签: javascript node.js express

我正在使用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);

1 个答案:

答案 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之类的东西在网络空间中是众所周知和理解的