Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 地理编码客户端不向地理编码api发送请求_Javascript_Firebase_Google Maps_Nodes_Geocoding - Fatal编程技术网

Javascript 地理编码客户端不向地理编码api发送请求

Javascript 地理编码客户端不向地理编码api发送请求,javascript,firebase,google-maps,nodes,geocoding,Javascript,Firebase,Google Maps,Nodes,Geocoding,我正在尝试在Firebase云函数上使用from Node.js。我希望从街道地址获得(lat,lng)。出于测试目的,我正在运行一个可调度的firebase函数,并从中调用库函数。但是,只有我的错误路径被执行。下面是我正在使用的环境细节和代码片段 环境详情 平台:Node.js v8上的firebase云功能 地理编码API版本:2.0.2 复制步骤 运行从地理编码api请求(lat、lng)的异步函数。函数体(index.js内部)如下所示 已执行以下初始化 API_KEY_GEOCOD

我正在尝试在Firebase云函数上使用from Node.js。我希望从街道地址获得(lat,lng)。出于测试目的,我正在运行一个可调度的firebase函数,并从中调用库函数。但是,只有我的错误路径被执行。下面是我正在使用的环境细节和代码片段

环境详情
  • 平台:Node.js v8上的firebase云功能
  • 地理编码API版本:2.0.2
复制步骤 运行从地理编码api请求(lat、lng)的异步函数。函数体(index.js内部)如下所示

已执行以下初始化

API_KEY_GEOCODING='*******************************'; // key not shown
const Client = require("@googlemaps/google-maps-services-js").Client;
我每隔1分钟使用调度程序API定期运行此函数

exports.scheduledUpdateDriverLocations = functions.pubsub.schedule('every 1 minutes').onRun( (context) => {
    return getDriverLocationNearAddress('1042 Middlefield Rd, Redwood City, CA');
});
控制台日志显示my
getDriverLocationsNearAddress
一直在点击catch语句,而没有在
then
部分中打印任何日志

但是,如果我尝试使用浏览器访问地理编码API,它会正常工作 我的google cloud api控制台显示,除了使用浏览器发送的api请求外,我没有收到任何api请求。在下图中,我只看到一个请求,尽管我每分钟发送一次请求,也就是在指定事件发生几分钟后

这是错误日志。我的请求似乎格式不正确,但不确定为什么会这样

{ Error: Request failed with status code 400
    at createError (/srv/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/srv/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/srv/node_modules/axios/lib/adapters/http.js:236:11)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  config: 
   { url: 'https://maps.googleapis.com/maps/api/geocode/json',
     method: 'get',
     headers: 
      { Accept: 'application/json, text/plain, */*',
        'User-Agent': 'google-maps-services-node-2.0.2' },
     transformRequest: [ [Function: transformRequest] ],
     transformResponse: [ [Function: transformResponse] ],
     paramsSerializer: [Function],
     timeout: 10000,
     adapter: [Function: httpAdapter],
     xsrfCookieName: 'XSRF-TOKEN',
     xsrfHeaderName: 'X-XSRF-TOKEN',
     maxContentLength: -1,
     validateStatus: [Function: validateStatus],
     httpsAgent: 
      HttpsAgent {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 443,
        protocol: 'https:',
        options: [Object],
        requests: {},
        sockets: {},
        freeSockets: [Object],
        keepAliveMsecs: 1000,
        keepAlive: true,
        maxSockets: Infinity,
        maxFreeSockets: 256,
        createSocketCount: 52,
        createSocketCountLastCheck: 0,
        createSocketErrorCount: 0,
        createSocketErrorCountLastCheck: 0,
        closeSocketCount: 51,
        closeSocketCountLastCheck: 0,
        errorSocketCount: 0,
        errorSocketCountLastCheck: 0,
        requestCount: 52,
        requestCountLastCheck: 0,
        timeoutSocketCount: 51,
        timeoutSocketCountLastCheck: 0,
        maxCachedSessions: 100,
        _sessionCache: [Object],
        [Symbol(agentkeepalive#currentId)]: 52 },
     address: '1044 Middlefield Rd, Redwood City, CA',
     components: 'country:US',
     key: '************************************',
     data: undefined },
  request: 
   ClientRequest {
     domain: 
      Domain {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        members: [Array] },
     _events: 
      { socket: [Function],
        abort: [Function],
        aborted: [Function],
        error: [Function],
        timeout: [Array],
        prefinish: [Function: requestOnPrefinish] },
     _eventsCount: 6,
     _maxListeners: undefined,
     output: [],
     outputEncodings: [],
     outputCallbacks: [],
     outputSize: 0,
     writable: true,
     _last: true,
     upgrading: false,
     chunkedEncoding: false,
     shouldKeepAlive: true,
     useChunkedEncodingByDefault: false,
     sendDate: false,
     _removedConnection: false,
     _removedContLen: false,
     _removedTE: false,
     _contentLength: 0,
     _hasBody: true,
     _trailer: '',
     finished: true,
     _headerSent: true,
     socket: 
      TLSSocket {
        _tlsOptions: [Object],
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        _SNICallback: null,
        servername: 'maps.googleapis.com',
        npnProtocol: false,
        alpnProtocol: false,
        authorized: true,
        authorizationError: null,
        encrypted: true,
        _events: [Object],
        _eventsCount: 9,
        connecting: false,
        _hadError: false,
        _handle: [Object],
        _parent: null,
        _host: 'maps.googleapis.com',
        _readableState: [Object],
        readable: true,
        domain: [Object],
        _maxListeners: undefined,
        _writableState: [Object],
        writable: true,
        allowHalfOpen: false,
        _bytesDispatched: 178,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: undefined,
        _server: null,
        ssl: [Object],
        _requestCert: true,
        _rejectUnauthorized: true,
        _idleTimeout: 15000,
        _idleNext: [Object],
        _idlePrev: [Object],
        _idleStart: 3119505,
        _destroyed: false,
        parser: null,
        _httpMessage: null,
        [Symbol(asyncId)]: -1,
        [Symbol(bytesRead)]: 0,
        [Symbol(asyncId)]: 4567,
        [Symbol(triggerAsyncId)]: 0,
        [Symbol(agentkeepalive#socketName)]: 'sock[51#maps.googleapis.com:443:::::::::]',
        [Symbol(agentkeepalive#socketRequestCount)]: 1,
        [Symbol(agentkeepalive#socketRequestFinishedCount)]: 1 },
     connection: 
      TLSSocket {
        _tlsOptions: [Object],
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        _SNICallback: null,
        servername: 

可能,我看到的是您无法从Web服务器调用API(跨源请求)。找到您的Web服务器名称(例如localhost:8080),并将其添加为授权的javascript源代码。您可以找到有关必须遵循的确切步骤的信息

当您可以使用浏览器访问API,但无法从(javascript)代码中访问API时,通常会出现这种行为。我还建议打印准确的错误,而不是日志语句,或者从catch块中同时打印这两个错误。大概是这样的:

.catch((error)=>{
    console.log('Error retrieving geocoded results: ' + error);
});

在从中运行了elevation API上的最小示例之后,我发现问题与如何向
geocode
函数提供参数有关

我对node.js代码做了如下更改

以前:我没有提供字段名
params

async function getDriverLocationNearAddress(streetAddress){
const geocodingClient = new Client({});
let params = {
        address: streetAddress,
        components: 'country:US',
        key: API_KEY_GEOCODING
    }; 
    console.log('retrieving lat, lng for ' + streetAddress);
    return geocodingClient.geocode(params)
    .then((response)=>{
        console.log('status: ' + response.data.status);
        console.log(response.data.results[0].geometry.location.lat);
        console.log(response.data.results[0].geometry.location.lng);
        return response;
    })
    .catch((error)=>{
        console.log('error retrieving geocoded results');
    });
}
之后:

async function getDriverLocationNearAddress(streetAddress){
const geocodingClient = new Client({});
let params = {
        address: streetAddress,
        components: 'country:US',
        key: API_KEY_GEOCODING
    }; 

    console.log('retrieving lat, lng for ' + streetAddress);
    geocodingClient.geocode({
        params:params
    })
    .then((response)=>{
        console.log('status: ' + response.data.status);
        console.log(response.data.results[0].geometry.location.lat);
        console.log(response.data.results[0].geometry.location.lng);
        return response;
    })
    .catch((error)=>{
        console.log('error retrieving geocoded results');
    });
}

你的钥匙有限制吗?我怀疑客户端请求正在使用webservice,在这种情况下,Javascript API的密钥受限将无法工作。尝试创建一个web服务密钥并使用它(或者一个不受限制的密钥,用于快速测试),我按照您的建议尝试并将密钥设置为不受限制的-删除了应用程序和API限制。仍然得到相同的结果。顺便说一句,我使用不受限制的api密钥运行
async function getDriverLocationNearAddress(streetAddress){
const geocodingClient = new Client({});
let params = {
        address: streetAddress,
        components: 'country:US',
        key: API_KEY_GEOCODING
    }; 

    console.log('retrieving lat, lng for ' + streetAddress);
    geocodingClient.geocode({
        params:params
    })
    .then((response)=>{
        console.log('status: ' + response.data.status);
        console.log(response.data.results[0].geometry.location.lat);
        console.log(response.data.results[0].geometry.location.lng);
        return response;
    })
    .catch((error)=>{
        console.log('error retrieving geocoded results');
    });
}