Node.js使用请求承诺的嵌套回调无效

Node.js使用请求承诺的嵌套回调无效,node.js,promise,callback,Node.js,Promise,Callback,我有一个非常简单的nodejs/expressapi,它在request.post()中发出request.get()。我只想res.sendrequest.get()的响应主体 我已经尝试过使用一个简单的回调函数来处理request和request-promise。然后()方法无效 const request = require('request') const rp = require('request-promise') app.get("/", (req, res) => {

我有一个非常简单的nodejs/expressapi,它在
request.post()中发出
request.get()
。我只想res.send
request.get()的响应主体

我已经尝试过使用一个简单的回调函数来处理
request
request-promise。然后()
方法无效

const request = require('request')
const rp = require('request-promise')

app.get("/", (req, res) => {
    var mapCenter
    var address = "user query"

    res.send(submitSearch());

    function submitSearch() {
        if (!mapCenter || !mapCenter.lat) {
            googleMapsClient.geocode({
                address: address,
            }, function(err, res) {
                if (!err) {
                    mapCenter = {lat:res.lat, lng:res.lng };

                    submitSearch();
                }
            });
        } else {
            var parameters = {
                uri: domain,
                form: {
                    latitude: mapCenter.lat,
                    longitude: mapCenter.
                },
                json: true
            }
            rp.post(parameters).then(function(res) {
                return getResults(res.id)
             })
        }
    }

    function getResults(id) {
        rp.get(domain+ id).then(function(res) {
            return res.Results;
         })

    }
})


app.get()


最令人困惑的是,我需要
submitSearch()
googleMapsClient
的奇怪if语句来正确分配
mapCenter
,然后再次递归调用
submitSearch()
。我知道这是一个异步问题,我看过的无数线程和视频都没有涵盖这种特殊类型的案例。

欢迎来到StackOverflow! 正如我在代码中看到的,在设置函数之前调用res.send。 而子搜索正在调用自己? 为了方便起见,我重写了如下代码:

const request=require('request'))
const rp=require('request-promise')
应用程序获取(“/”,(请求,请求)=>{
var地图中心;
var address=“用户查询”;
如果(!mapCenter | |!mapCenter.lat){
googleMapsClient.geocode({
地址:地址:,
},函数(错误,地理代码响应){
如果(!err){
地图中心={lat:res.lat,lng:res.lng};
res.send(geocodeResponse);
}否则{
throw err;//如果不是断言,则抛出错误。
}
});
}否则{
变量参数={
uri:域,
表格:{
纬度:mapCenter.lat,
经度:mapCenter.lng
},
json:true
};
rp.post(参数).then(函数(){
rp.get(域+id)。然后(函数(ReqPromisers){
res.send(geocodeResponse);
})
});
}
})

我建议对
.geocode()
使用promise API,这样您就不会试图混合使用普通回调和承诺。这不仅可以简化您的代码,还可以使健壮的错误处理变得更加简单。到目前为止,我在这里看到的所有建议都缺少各种错误处理。我也不明白为什么你需要在这里递归地称呼自己

const rp = require('request-promise');

app.get("/", (req, res) => {
    let address = "user query";

    // use promise interface for geocode
    googleMapsClient.geocode({address}).asPromise().then(response => {
        return {lat: response.lat, lng: response.lng };
    }).then(mapCenter => {
        const parameters = {
            uri: domain,
            form: {
                latitude: mapCenter.lat,
                longitude: mapCenter.lng
            },
            json: true
        };
        return rp.post(parameters);        
    }).then(id => {
        return rp.get(domain+ id).then(res => res.Results);
    }).then(results => {
        res.send(results);
    }).catch(err => {
        // decide what to do here if there's an error
        console.log(err);
        res.sendStatus(500);
    });
});
注意,图中显示:

const googleMapsClient = require('@google/maps').createClient({
  key: 'your API key here',
  Promise: Promise
});

因此,您可能需要告诉it在初始化这样的东西时使用哪个Promise实现来使用内置Promise。

我看到您正在重新发送
geoCodeResponse
,它来自
googleMapsClient
。我实际上再次调用
submitSearch
,因为我需要从else语句中发送
post body
。具体来说,我是在使用
googleMapsClient
设置
mapCenter
后发布到自定义域的。嗯,不要编辑您的问题以包含最终解决方案。这不是stackoverflow的工作方式。问题仍然是问题。答案就在答案所在的地方。我们希望您的问题显示您提出的原始问题,以便这可以成为原始问题的永久参考,然后是该问题的一个或多个答案。请编辑您的问题,使其恢复原样。虽然@Akatsuki levi的回答没有给出正确的结果。他的洞察力引导我自己编辑代码,以获得我所需要的。如果我仍然接受他/她的答案可以吗?您可以添加自己的答案,以显示您最终决定使用的内容(是的,您可以回答自己的问题)。我正在研究一个答案,如果你想等一等,我认为这个答案比这两个都好,因为使用promise界面到googleMaps和chain promise实际上要简单得多,这样你就可以在一个地方处理所有的错误。Levi的答案缺少很多错误处理。我现在发布了我的简化答案。非常感谢@jfriend00。这解决了我的问题。