如何将值从辅助函数返回给服务器.js NodeJS
How to return value from helper function back to server.js NodeJS
对于我的项目,我有一个服务器.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
});
});
相关文章:
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 将客户端特定的日期格式返回到服务器MVC4
- 如何解决“;错误所请求的URL返回500-内部服务器错误”;
- 使用ajax上传的文件返回错误,但使用c#在asp.net的服务器端正常提交的文件
- post()向服务器动态生成的数据返回空响应
- NodeJS服务器在检索部分时返回505/404错误
- 如何从jQuery对象文本正确调用服务器端ASP.NET并将数据返回给jQuery
- 从服务器返回exe文件,并通过浏览器在客户端下载
- 如何检查服务器是否返回未定义然后忽略它
- 对服务器的 GET 请求返回 net::ERR_CONNECTION_REFUSED
- 如何从服务器端控制器返回或调用已签名的小程序的方法
- 如何使用 HTML 图像请求将数据发送到服务器,或返回数据作为响应
- 为什么我的 sinon 假服务器不返回任何内容
- ASP:代码隐藏的字段变量在从更新面板中的服务器返回时丢失值
- 在页面发布到服务器并返回错误后保留 javascript 更改
- web2py服务器返回错误,但已提交查询
- Ajax post后数组在服务器端返回为空
- 返回之前获取数据服务器端
- 当在运行nodejs的服务器上调用new Date()时,Date将返回服务器启动时的日期
- 从服务器调用确认对话框 ASP.NET.并返回服务器上的选择