首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Nuxt和serverMiddleware (Node )解决变量范围问题

用Nuxt和serverMiddleware (Node )解决变量范围问题
EN

Stack Overflow用户
提问于 2020-12-30 22:23:58
回答 1查看 40关注 0票数 0

我用的是努克斯特。我正在尝试使用Zoom的API,它坚持让我做服务器端调用。所以我做了一个serverMiddleware,看起来是这样的:

代码语言:javascript
复制
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不熟悉,所以我知道这需要我重写。我只想知道我该怎么重写它。

EN

回答 1

Stack Overflow用户

发布于 2020-12-31 19:36:30

我重写了它,并使用了“节点获取”库,而不是“https”库。这样要优雅得多。

代码语言:javascript
复制
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)
    }
}

我仍然会把这个留给那些还能回答原来问题的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65514313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档