【问题标题】:Resolve Variable Scope Problem with a Nuxt and serverMiddleware (Node API)使用 Nuxt 和 serverMiddleware (Node API) 解决变量范围问题
【发布时间】:2021-04-07 09:23:24
【问题描述】:

我正在使用 Nuxt。我正在尝试使用 Zoom 的 API,该 API 坚持要求我进行服务器端调用。于是我做了一个serverMiddleware,看起来像这样:

require('dotenv').config
const https = require('https')
const querystring = require('querystring')

export default function(req, res){
    if (req.method === 'GET'){
        const url = new URL(req.url, `http://${req.headers.host}`)

        let host = 'zoom.us'
        let tail = '/oauth/token?'
        let query = querystring.stringify({
            grant_type: 'authorization_code',
            code: url.searchParams.get('code'),
            redirect_uri: process.env.NUXT_ENV_BASE_URL
        })
        
        let data = process.env.NUXT_ENV_ZOOM_CLIENT_ID + ':' + process.env.NUXT_ENV_ZOOM_CLIENT_SECRET
        let newData = Buffer.from(data, 'utf8')
        let b64string = newData.toString('base64')

        function getZoomAccessToken(){
            const options = {
                hostname: host,
                path: tail + query,
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': 'Basic ' + b64string
                }
            }
            return https.request(options, response => {
                let data = ''
                response.on('data', (chunk) => { 
                    data += chunk.toString()
                })
            
                response.on('end', () => { 
                    console.log(JSON.parse(data)); 
                })
            })
            .on('error', (error) => { 
                console.log('An error', error)
            })
            .end()  
        }
        
        let body = getZoomAccessToken()
        console.log(body)
        res.writeHead(200, {
            'Content-Type': 'application/json'
        })
        res.end(body)
    }
}

如您所见,我在尝试从 https.request 回调中获取数据时遇到了麻烦。如何确保我可以将响应返回给客户端?

更新:为了添加更多上下文,body 返回请求,而不是任何响应。我认为将 https.request 函数包装在另一个函数中有助于捕获响应,但它不起作用。我不熟悉 Node,所以我知道这需要我重写。我只是想知道我应该如何重写它。

【问题讨论】:

  • 勾选这个require('dotenv').config需要调用config函数:require('dotenv').config()
  • 谢谢,但这不是问题。

标签: node.js api nuxt.js nuxtjs


【解决方案1】:

我重写了它并使用了“node-fetch”库而不是“https”库。这种方式更优雅。

require('dotenv').config()
const fetch = require('node-fetch')
const querystring = require('querystring')

export default function(req, res){
    if (req.method === 'GET'){
        const url = new URL(req.url, `http://${req.headers.host}`)

        let data = process.env.NUXT_ENV_ZOOM_CLIENT_ID + ':' + process.env.NUXT_ENV_ZOOM_CLIENT_SECRET
        let newData = Buffer.from(data, 'utf8')
        let b64string = newData.toString('base64')

        const options = {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + b64string
            }
        }

        let zoomUrl = new URL('https://zoom.us/oauth/token')
        zoomUrl.searchParams.set('grant_type', 'authorization_code')
        zoomUrl.searchParams.set('code', url.searchParams.get('code'))
        zoomUrl.searchParams.set('redirect_uri', process.env.NUXT_ENV_BASE_URL)

        const getData = async options => {
            try {
                const response = await fetch(zoomUrl, options)  
                const json = await response.json()
                res.setHeader('Content-Type', 'application/json')
                res.end(JSON.stringify(json))
            }
            catch(e) {
                console.log(e)
            } 
        }

        getData(options)
    }
}

我仍然会留给仍然可以回答原始问题的任何人。

【讨论】:

    猜你喜欢
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多