简体   繁体   English

如何解决:“无法读取未定义的属性'then'”

[英]how to fix: 'Cannot read property 'then' of undefined'

I have a problem when I try get response from my function, I'm just start use Promises, so maybe I did something wrong. 当我尝试从函数中获取响应时遇到问题,我只是开始使用Promises,所以也许我做错了。 When I start my app, I get error then: Cannot read property 'then' of undefined . 当我启动我的应用程序时,出现错误: Cannot read property 'then' of undefined What I did wrong? 我做错了什么? Until I start using Promises, everything worked well, after I tried to change app logic it crashed. 在我尝试更改应用程序逻辑后,直到我开始使用Promises之前,一切都运行良好。 My main file below: 我的主文件如下:

/app.js

const request = require('request');
const yargs = require('yargs');

const geocode = require('./geocode/geocode')

const argv = yargs
    .options({
        a: {
            demand: true,
            alias: 'address',
            string: true,
            describe: 'Address to fetch weather for'
        }
    })
    .help()
    .alias('help', 'h')
    .argv;

geocode.geocodeAddress(argv.a)
.then((res) => {
    console.log(res);
},
(error) => {
    console.log(error);
})

my geocode file: 我的地理编码文件:

/geocode/geocode.js
const request = require('request');

const geocodeAddress = (address) => {
    const encodedAddress = encodeURIComponent(address);

    request({
        url: `https://maps.googleapis.com/maps/api/geocode/json?key=myKey&address=${encodedAddress}`,
        json: true
    }, (err, res, body) => {
        return new Promise((resolve, reject) => {
            if(err){
                reject('Unable to connect to Google servers.')
            } else if (body.status === 'ZERO_RESULTS') {
                reject('Unable find any address.')
            } else if (body.status === 'OK') {
                const lat = body.results[0].geometry.location.lat;
                const lon = body.results[0].geometry.location.lng;
                const adrs = body.results[0].formatted_address;
                const answer = {
                    lat: lat,
                    lon: lon,
                    address: adrs
                };
                resolve(answer);
            }
        })
    })
};

module.exports.geocodeAddress = geocodeAddress;

it is probably because your geocodeAddress is a constant and not an async function. 这可能是因为您的geocodeAddress是一个常量而不是一个异步函数。

blind shot try: 盲目尝试:

async geocodeAddress (address) {

and like @liam said, try: 就像@liam说的那样,尝试:

return request({...})

Code that solve it for me: 为我解决的代码:

const request = require('request');

const geocodeAddress = (address) => {
    const encodedAddress = encodeURIComponent(address);

    return new Promise((resolve, reject) => { 
        request({
        url: `https://maps.googleapis.com/maps/api/geocode/json?key=myKey&address=${encodedAddress}`,
        json: true
    }, (err, res, body) => {
            if(err){
                reject('Unable to connect to Google servers.')
            } else if (body.status === 'ZERO_RESULTS') {
                reject('Unable find any address.')
            } else if (body.status === 'OK') {
                const lat = body.results[0].geometry.location.lat;
                const lon = body.results[0].geometry.location.lng;
                const adrs = body.results[0].formatted_address;
                const answer = {
                    lat: lat,
                    lon: lon,
                    address: adrs
                };
                resolve(answer);
            }
        })
    })
};

module.exports.geocodeAddress = geocodeAddress;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM