如何将值从辅助函数返回给服务器.js NodeJS

How to return value from helper function back to server.js NodeJS

本文关键字:返回 服务器 js NodeJS 函数      更新时间:2023-09-26

对于我的项目,我有一个服务器.js它调用一个辅助函数位置搜索.js如下所示。

var express = require('express');
var server = express.Router();
var placeSearch = require("./helpers/place-search");
var obj = "hello";
server.use(function(req, res, next) {
	console.log(req.method, req.url);
	next();
}); 
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");
	placeSearch.placeSearch(obj);
});
module.exports.server = server;

这是我的地方搜索.js :

var config = require("./config.js");
var Promise = require('bluebird');
var DistanceMatrix = require("./distance-matrix.js");
var GooglePlaces = Promise.promisifyAll(require("googleplaces"));
var googlePlaces = new GooglePlaces(config.apiKey, config.outputFormat);
var extract = require('./extract.js');
var combination = require('./combination_ver2.js');
var permutation = require('./permutation.js');
function placeSearch(obj) {
    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);
            }
        })
    });
}
module.exports.placeSearch = placeSearch;

我的问题是我不知道如何将结果变量传递回服务器.js以便我可以将该结果用作另一个帮助程序函数的输入。我一辈子都想不通该怎么做。任何帮助将不胜感激。

好吧,我现在根本没有看到您的 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);
    }); 
});

为了支持这一点,您的 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不会像您期望的那样工作。 ar.map是一个同步函数,你在里面调用异步代码......不会按照你想象的方式工作。 这篇文章有点长,但你应该看看 npm 的async库来管理一系列异步请求以收集一个组合结果。

使用回调,你的代码看起来像这样:

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);
            }
        })
    });
}

在服务器中.js:

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");
    placeSearch.placeSearch(obj,function(err,result){
       if(!err){
console.log(result);
}
})
});

异步操作似乎遇到了问题。您需要从地点搜索模块中return承诺。您还需要将 placeSearch 的回调转换为承诺。

编辑:更新,因为googlePlaces.placeSearch没有返回承诺

内部placeSearch

function placeSearch(obj) {
  //...
  var promises = ar.map(function(name) {
    var placeDefer = Q.defer();
    return googlePlaces.placeSearch(name, function(response) {
      placeDefer.resolve(response); // or placeDefer.reject if a failure occurs
    });
    return placeDefer.promise;
  });
  return promises;
}

在您的路线中:

// 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
    });
});