SyntaxError: «await» допустимо только в «асинхронной» функции - требуется помощь - PullRequest
0 голосов
/ 15 октября 2019

Итак, я создаю бота (специально для Discord), и я очень плохо знаком с JavaScript и вообще пишу код.

Я смотрел учебник об очистке сообщений от команды области (Вы сообщаете боту, сколько сообщений удалить, и он делает это.)

Все шло гладко, я работалв течение почти часа на этой команде, и после того, как я сохранил и запустил «бот» в моей CMD, я получил эту ошибку (показано в разделе ошибок и области ожидаемых результатов)

В основном:

const fetched = await message.channel.fetchMessages ({limit: args [0]});

SyntaxError: await действителен только в асинхронной функции

Но я почти уверен, что это async функция, я все еще очень плохо знаком с кодированием, поэтому я мог ее закрытьвыключен или что-то, не уверен.

К вашему сведению в строке 31 Я думал, что "включил" вещь async, но, возможно, я ее закрыл.

Я не отправил полный код.

Поскольку я очень новичок в кодировании, я не мог ничего сделать. Я добавил ";"(без кавычек), которая исправила одну ошибку, но не ту, о которой я спрашиваю.

// Purge messages command.
if (msg.startsWith(prefix + 'PURGE')) { // COmmand checks like "!PING", but ``startWith`` because you'll be adding a number.
  // Wrapping in an async because ``awaits`` only work in asyncs.
  async function purge() {
    message.delete(); // Deletes command trigger, to clean up the chat more fully.

    //Now, we want to check if the user has the `Moderator` role.
    if (!message.member.roles.find("name", "Moderator")) { // This checks to see if they DONT have that role (the "!" inverts the true/false)
      message.channel.send('You need the Moderator role to use this command!');
      return; // This returns the code, so the rest doesn't run.
    }
  }
  // Check if the argument is a number.
  if (isNaN(args[0])) {
    // Posts that the message is NaN (not a number)
    message.channel.send('Your argument was not a number. \n Usage:  ' + 
      prefix + 'purge  <amount>'); //\n turns into a new line.
    // Stops the actions, so it doesn't start deleting messages.
    return;
  }

  const fetched = await message.channel.fetchMessages({limit: args[0]}); // This takes the argument number.

Ожидаемый результат: бот включается и удаляет большое количество указанных сообщений.

CompleteСообщение об ошибке:

C: \ Users \ xxxx \ OneDrive \ Desktop \ Xxxxx xxx \ xxx.js: 49 const fetched = await message.channel.fetchMessages ({limit: args [0]});// Это принимает номер аргумента.

SyntaxError: await действителен только в асинхронной функции в Module._compile (internal / modules / cjs / loader.js: 723: 23) в Object.Module._extensions .. js (внутренняя / modules / cjs / loader.js: 789: 10) в Module.load (внутренняя / modules / cjs / loader.js: 653: 32) в tryModuleLoad (внутренняя / modules / cjs / loader.js: 593:12) в Function.Module._load (внутренняя / modules / cjs / loader.js: 585: 3) в Function.Module.runMain (внутренняя / modules / cjs / loader.js: 831: 12) при запуске (внутренняя / bootstrap)/node.js:283:19) в bootstrapNodeJSCore (внутренний / bootstrap / node.js: 622: 3)

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

Ваш последний выбор должен быть заключен в асинхронную функцию, чтобы использовать await. Либо чем, либо вам нужно использовать then для разрешения обещания.

const getData = async (arg) => {
    const data = await message.channel.fetchMessages({limit: args})
    return await data.json()
}

В этом примере вам придется разрешить getData, что означает, что вам нужно либо использовать then, либооберните его контекст в async - оберните его в асинхронную функцию.

Или:

 message.channel.fetchMessages({limit: args[0]})
    .then(response => response.json())
    .then(data => {
    /* do something here */
})
0 голосов
/ 15 октября 2019

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

async function func() {
    await ~
}

изменить ваш код, как этот стиль

0 голосов
/ 15 октября 2019

Вы должны пометить свой метод как async.

Примеры из асинхронной функции Mozilla .

async function asyncCall() {
  console.log('calling');
  var result = await resolveAfter2Seconds();
  console.log(result);
  // expected output: 'resolved'
}
var parallel = async function() {
  console.log('==PARALLEL with await Promise.all==');

  // Start 2 "jobs" in parallel and wait for both of them to complete
  await Promise.all([
      (async()=>console.log(await resolveAfter2Seconds()))(),
      (async()=>console.log(await resolveAfter1Second()))()
  ]);
}
...