节点js中的等待/异步功能

时间:2021-04-26 11:31:05

标签: node.js async-await

我是 node js 的新手,我想使用 await 语句让我的代码等待 Promise。我的承诺是使用 Discord API 来知道用户是否是特定服务器的成员。但是在执行“SyntaxError:await 仅在异步函数中有效”时出现错误。但我的代码是一个异步函数,所以我不明白有什么问题。谢谢。

(async () => {

const http = require('http');
const fs = require('fs');
const port = 53134;
const url = require('url');
const fetch = require('node-fetch');
const { execFile } = require('child_process');


let discordLog = async (accessCode) => {
    let isEclaire = false;
    const data = {
        client_id: '805884181811822624',
        client_secret: 'JRSPE0nmRn881Mi9cLC-gMozHKWLQVPT',
        grant_type: 'authorization_code',
        redirect_uri: 'http://localhost:53134',
        code: accessCode,
        scope: 'identify guilds',
    };
    return new Promise(() =>{
    fetch('https://discord.com/api/oauth2/token', {
        method: 'POST',
        body: new URLSearchParams(data),
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
    })
    .then(discordRes => discordRes.json())
    .then(discordData => {
        console.log(discordData);
        return discordData;
    })
    .then(discordData => fetch('https://discord.com/api/users/@me', {
        headers: {
        authorization: `${discordData.token_type} ${discordData.access_token}`,
        },
    }))
    .then(userRes => userRes.json())
    .then(userData => {
        console.log(userData);
        return userData;
    })
    .then(userData => fetch(`https://discord.com/api/guilds/799385448824438824/members/${userData.id}`, {
        headers: {
        authorization: `Bot ODA1ODg0MTgxODExODIyNjI0.YBhYIQ.h4zLzR7ybBC1uvFSb4iZTH-JVhM`,
        },
    }))
    .then(guildRes => guildRes.json())
    .then(guildData => {
        console.log(guildData)
        for(let i = 0; i<guildData.roles.length; i++) {
            console.log(guildData.roles[i]);
            if(guildData.roles[i] == '786007786500784138' || guildData.roles[i] == '805560066715025468' ) isEclaire = true;
        }
        return(isEclaire);
        
        })
    })
}

http.createServer((req, res) => {
    let responseCode = 404;
    let content = '404 Error';
    const urlObj = url.parse(req.url, true);
    let isEclaire = false;

    if (urlObj.query.code) {
        const accessCode = urlObj.query.code;
    console.log(`The access code is: ${accessCode}`);
        isEclaire = await discordLog(accessCode);
        } 
  if(isEclaire){
        res.writeHead(301,{Location: 'https://www.speedtest.net/'});
    }else{
  if (urlObj.pathname === '/') {
    responseCode = 200;
    content = fs.readFileSync('./sso-discord.html');
  }
    res.writeHead(responseCode, {
        'content-type': 'text/html;charset=utf-8',
    },
    );
    res.write(content);
    }
    res.end();
})
.listen(port);
})()

2 个答案:

答案 0 :(得分:0)

首先 createServer 不是异步函数。您应该需要将获取的数据包装到一个单独的异步函数中。然后在这里调用它。

答案 1 :(得分:0)

尝试将您的 http 服务器的请求事件处理程序变成异步函数

改变这个

 http.createServer((req, res) => {   /* not async */

到这里

 http.createServer(async (req, res) => {

并确保您使用的是相对较新版本的 nodejs。