Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从helper函数返回值到server.js NodeJS_Javascript_Node.js - Fatal编程技术网

Javascript 如何从helper函数返回值到server.js NodeJS

Javascript 如何从helper函数返回值到server.js NodeJS,javascript,node.js,Javascript,Node.js,对于我的项目,我有一个server.js调用助手函数place-search.js,如下所示 var express=需要“express”; var server=express.Router; var placeSearch=require./helpers/placeSearch; var obj=你好; server.usefunctionreq,res,next{ console.logreq.method,req.url; 下一个 }; server.post'/',functi

对于我的项目,我有一个server.js调用助手函数place-search.js,如下所示

var express=需要“express”; var server=express.Router; var placeSearch=require./helpers/placeSearch; var obj=你好; server.usefunctionreq,res,next{ console.logreq.method,req.url; 下一个 }; server.post'/',functionreq,res{ /*获取客户端的post请求传递的对象*/ obj=请求主体; //console.logObj:+obj; /*将确认发送回客户机*/ res.status200.sendbody; placeSearch.placeSearchobj; };
module.exports.server=服务器 嗯,我现在看不到placeSearch函数返回任何内容,也没有执行任何类型的回调。placeSearch函数应该公开一个回调参数,一旦得到想要返回的答案,就会调用该参数

然后,服务器文件将对该回调执行操作。缩写你的代码,看起来是这样的:

server.post('/', function(req, res) {
    /* get the object passed by the client's post request */
    obj = req.body;

    //console.log("Obj: " + obj);
    placeSearch.placeSearch(obj, function(error, data){
       /* send the data back to the client */
       res.status(200).send(data);
    }); 
});
function placeSearch(obj,callback) {

    console.log("Inside place search!");

    /**
     * Place search - https://developers.google.com/places/documentation/#PlaceSearchRequests
     */
    var arr = [];
    var count = 0;
    var rad = obj["radius"];

    console.log("radius: " + rad);
    var loc = obj["location"];
    console.log("Location: " + loc);
    var mode = obj["mode"];

    var params = obj["params"];

    /* client's keywords */
    var arr;
    var ar = [];
    for (var i = 0; i < params; i++) {
        arr[i] = obj[i];
        console.log(arr[i]);
        var param = {
            location: loc,
            radius: rad,
            mode: mode,
            keyword: arr[i]
        };
        ar.push(param);
    }

    console.log("before promises");

    var promises = ar.map(function(name) {
        return googlePlaces.placeSearch(name, function(response) {
            arr.push(response);
            console.log(response);
            console.log(count++);
            //If all responses have been returned
            //Find combos and pass to distance-matrix
            if (count == ar.length) {
                var Matrix = new Array();
                var result = new Array();

                //to extract only lat and lng from arr.results
                //Matrix = extract.extract(arr);
                result = combination.combination(arr);

                // NOW RESULT IS THE ARRAY OF ALL COMBINATION

                // NOW RESULT IS THE ARRAY OF COMBINATIONS OF latlng pairs AND PASS IT TO FRONTEND
                /*result.forEach(function(combo, index) {
                    console.log("combo" + combo)
                    DistanceMatrix.distanceMatrix(mode, combo, result.length);
                });*/


                // IF YOU WANT TO SEE PERMUTATION
                //permutation.permutation(result);

                console.log("combination results: " + result);

                callback(null,result);
            }

        })
    });

}
为了支持这一点,您的placeSearch函数必须在适当的时候调用其回调:

function placeSearch(obj, callback){

   /* all the stuff you do to assemble your data */
   // if (there_is_some_error):
   if(err) return cb(err);

   // when you have all your data available, no error has occurred
   return cb(null, data);
}

您可能注意到的另一点是,您的ar.map不会像您预期的那样工作。map是一个同步函数,您正在调用内部的异步代码。。。不会像你想的那样工作。这篇文章有点长,但您应该查看npm中的异步库,以管理异步请求数组来收集一个组合结果

使用回调您的代码如下所示:

server.post('/', function(req, res) {
    /* get the object passed by the client's post request */
    obj = req.body;

    //console.log("Obj: " + obj);
    placeSearch.placeSearch(obj, function(error, data){
       /* send the data back to the client */
       res.status(200).send(data);
    }); 
});
function placeSearch(obj,callback) {

    console.log("Inside place search!");

    /**
     * Place search - https://developers.google.com/places/documentation/#PlaceSearchRequests
     */
    var arr = [];
    var count = 0;
    var rad = obj["radius"];

    console.log("radius: " + rad);
    var loc = obj["location"];
    console.log("Location: " + loc);
    var mode = obj["mode"];

    var params = obj["params"];

    /* client's keywords */
    var arr;
    var ar = [];
    for (var i = 0; i < params; i++) {
        arr[i] = obj[i];
        console.log(arr[i]);
        var param = {
            location: loc,
            radius: rad,
            mode: mode,
            keyword: arr[i]
        };
        ar.push(param);
    }

    console.log("before promises");

    var promises = ar.map(function(name) {
        return googlePlaces.placeSearch(name, function(response) {
            arr.push(response);
            console.log(response);
            console.log(count++);
            //If all responses have been returned
            //Find combos and pass to distance-matrix
            if (count == ar.length) {
                var Matrix = new Array();
                var result = new Array();

                //to extract only lat and lng from arr.results
                //Matrix = extract.extract(arr);
                result = combination.combination(arr);

                // NOW RESULT IS THE ARRAY OF ALL COMBINATION

                // NOW RESULT IS THE ARRAY OF COMBINATIONS OF latlng pairs AND PASS IT TO FRONTEND
                /*result.forEach(function(combo, index) {
                    console.log("combo" + combo)
                    DistanceMatrix.distanceMatrix(mode, combo, result.length);
                });*/


                // IF YOU WANT TO SEE PERMUTATION
                //permutation.permutation(result);

                console.log("combination results: " + result);

                callback(null,result);
            }

        })
    });

}

似乎您在异步操作方面遇到了问题。您需要从您的位置搜索模块返回承诺。您还需要将placeSearch的回调转换为承诺

编辑:自googlePlaces.placeSearch不返回承诺后更新

内部搜索

在你的路线上:

// I'm going to just assume Q promise library here
var Q = require("q");

server.post('/', function(req, res) {
    /* get the object passed by the client's post request */
    obj = req.body;

    //console.log("Obj: " + obj);

    /* send the confirmation back to the client */
    res.status(200).send("body");

    Q.all(placeSearch.placeSearch(obj))
    .spread(function() {
      var places = Array.prototype.slice.call(arguments);

      // possibly call res.status(200).send("body"); here?
      // only if you're trying to use the places in your response
    });
});

是的,尽管使用了var promises=,但看起来并不是什么承诺。我假设googlePlaces.placeSearch返回了一个承诺。如果他使用的是npm模块的话就不是了。