TypeError:无法读取属性'拆分'为null

TypeError: Cannot read property 'split' of null

本文关键字:null 拆分 属性 读取 TypeError      更新时间:2023-09-26

我尝试验证连接到Google API以便使用Google Analytics。这是我的代码:

'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

这是我在handleAuthCallback函数中尝试打印parse时得到的对象:

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' }

我真的不理解这个错误,因为在我重构代码之前它一直在工作。关于我哪里可能错了,有什么建议吗?

谢谢。

假设query是对象,请尝试以下操作:

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

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')

parse是CCD_ 5的结果。这没有查询属性,所以parse.queryundefined,因此parse.query.split会产生错误,当您进行一些重构时,定义query的代码可能会被删除。