2015-11-29 3 views
0

Я пытаюсь аутентифицировать, чтобы подключиться к Google API, чтобы использовать Google Analytics. Вот мой код:TypeError: Невозможно прочитать свойство «split» из null

'use strict' 


const fs = require('fs') 
const open = require('open') 
const Fs = require('fs') 
const Google = require('googleapis') 
const Url = require('url') 
const Http = require('http') 


const CREDENTIALS_DIR = './.credentials/' 
const SECRET_PATH = CREDENTIALS_DIR + 'google-analytics-secret.json' 
const TOKEN_PATH = CREDENTIALS_DIR + 'google-analytics-accesstoken.json' 


let auth = loadCredentials() 
const oauth2Client = new Google.auth.OAuth2(
    auth.CLIENT_ID, 
    auth.CLIENT_SECRET, 
    auth.REDIRECT_URL) 

function loadCredentials() { 

    try { 
    let secret = Fs.readFileSync(SECRET_PATH) 
    console.log('Credentials successfully loaded from file.') 
    return { 
     CLIENT_ID: JSON.parse(secret).web.client_id, 
     CLIENT_SECRET: JSON.parse(secret).web.client_secret, 
     REDIRECT_URL: JSON.parse(secret).web.redirect_uris[0] 
    } 
    } 
    catch (err) { 
    if (err.code !== 'ENOENT') { 
     throw err 
    } 
    else { 
     console.log('Credentials successfully loaded from environment.') 
     return { 
     CLIENT_ID: process.env.GOOGLE_CLIENT_ID, 
     CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET, 
     REDIRECT_URL: 'http://localhost:1234/' 
     } 
    } 
    } 
} 

function getScopes() { 

    return [ 
    'https://www.googleapis.com/auth/drive.readonly', 
    'https://www.googleapis.com/auth/analytics.readonly' 
    ] 
} 


function getAuthCallbackServer() { 

    let url = oauth2Client.generateAuthUrl({ 
    access_type: 'offline', 
    scope: getScopes() 
    }) 

    open(url, 'chrome') 

    let server = Http.createServer(handleAuthCallback) 

    server.listen(9999,() => { 
    console.log('Server listening on: http://localhost:1234') 
    }) 
} 


// Parse Code sent by Google 
function handleAuthCallback (req, res) { 

    let parse = Url.parse(req.url) 
    let code = parse.query.split('=').pop() 
    console.log(`Got code: ${code}`) 

    res.writeHead(200) 
    res.end('Awesome... Got the Code') 

} 

getAuthCallbackServer() 

Я пытаюсь сделать это модульным с использованием функций, и я получаю следующее сообщение об ошибке (внутри функции handleAuthCallback):

TypeError: Cannot read property 'split' of null 

Это объект, который я получил, когда Я пытаюсь напечатать parse в функции handleAuthCallback:

Url { 
protocol: null, 
slashes: null, 
auth: null, 
host: null, 
port: null, 
hostname: null, 
hash: null, 
search: '?code=x/xxxxxxxxxxxxxxxxxxxxxxxx', 
query: 'code=x/xxxxxxxxxxxxxxxxxxxxxxxx', 
pathname: '/', 
path: '/?code=x/xxxxxxxxxxxxxxxxxxxxxxxx', 
href: '/?code=x/xxxxxxxxxxxxxxxxxxxxxxxx' } 

Я не очень понимаю эту ошибку, как это было работать, прежде чем я переработан мой код. Какие-нибудь советы о том, где я могу ошибаться?

Спасибо.

+0

Вы пытались напечатать '' parse' и parse.query', чтобы убедиться, что это действительно 'null', а затем исправить его оттуда? Возможно, 'req.url' - это не то, что вы ожидаете (и нет запроса)? – h2ooooooo

+0

Я думаю, что 'parse' - это строка кода' let code = parse.query.split ('='). Pop() 'является строкой, поэтому она не имеет свойства' query'. Так ты это проверил? –

+0

Да. Ключ «запрос» содержит код, и он печатает код с линией «Got Code: $ {code}, прежде чем я получу ошибку – Synleb

ответ

0

Этот function вызывается:

// Parse Code sent by Google 
function handleAuthCallback (req, res) { 

    let parse = Url.parse(req.url) 
    let code = parse.query.split('=').pop() 
    console.log(`Got code: ${code}`) 

    res.writeHead(200) 
    res.end('Awesome... Got the Code') 

} 

, когда обратного вызова происходит, указанный здесь:

let server = Http.createServer(handleAuthCallback) 

Url определяется здесь:

const Url = require('url') 

синтаксического анализа является результатом Url.parse(req.url). Это свойство не имеет свойства запроса, поэтому parse.query - undefined, и поэтому parse.query.split приведет к ошибке, возможно, что, когда вы сделали некоторый рефакторинг, код, который определил query, был удален.

+0

сразу после' let parse = Url.parse (req.url) 'I added 'console .log (parse.query.split ('='). pop()) 'вместо' let code = parse.query.split ('='). pop() 'и console.log показывают код. показывает код с 'console.log ('Got code: $ {code}')', но дайте мне ошибку сразу после – Synleb

0

Предполагая query есть объект, попробуйте следующее:

let parse = Url.parse(req.url); 
let code = parse.query.code; 
+0

Аналогичная ошибка: 'TypeError: Невозможно прочитать код свойства 'null' – Synleb

+0

Это объект, который я получаю при печати 'parse', который равен' Url.parse (req.url) ':' Url { protocol: null, slashes: null, auth: null, host: null , port: null, имя хоста: null, хэш: null, поиск: '?Код = х/xxxxxxxxxxxxxxxxxxxxxxxx», запроса: 'Код = х/xxxxxxxxxxxxxxxxxxxxxxxx', имя пути: '/', путь: '?/код = х/xxxxxxxxxxxxxxxxxxxxxxxx', HREF: '?/код = х/xxxxxxxxxxxxxxxxxxxxxxxx' } ' – Synleb

Смежные вопросы