Как я могу исправить «this.reduce () не является функцией»?

#javascript #node.js #express

#javascript #node.js #выразить

Вопрос:

Это мой код :

   app.get("/", (req, res) => {
    const reducer = (acc, guildCount) => acc   guildCount;
    const results = client.shard.fetchClientValues('guilds.cache.size');
    
    console.log(results)
    let guildCount  = results.reduce(reducer, 0)
    console.log(guildCount)

    renderTemplate(res, req, "index.ejs", { guildCount });
  });
  

Некоторые подробности:`

client.shard.fetchClientValues('guilds.cache.size') Возврат Promise { <pending> } .

Ошибка, когда я хочу загрузить это: TypeError: results.reduce is not a function `

Этот код работает :

 client.shard.fetchClientValues('guilds.cache.size')
    .then(results => {
        console.log(`${results.reduce((acc, guildCount) => acc   guildCount, 0)} total guilds`);
    })
    .catch(console.error);
  

Но я должен определить результат в переменной, чтобы экспортировать его.

Как я могу это исправить? Есть ли другой способ определить результат с помощью reduce?

Комментарии:

1. Когда обещание разрешает, в каком формате находится results ?

Ответ №1:

Метод Reduce работает с массивами, поэтому, если значение reduce не определено, первое, что вы узнаете, «результаты» не являются массивом. Теперь вопрос в том, почему?

 const results = client.shard.fetchClientValues('guilds.cache.size');
  

это асинхронный метод, который возвращает обещание. и когда вы используете его без .then()

взамен вы получите объект promise, а не массив. вам придется подождать, пока обещание будет выполнено.

 const results = await client.shard.fetchClientValues('guilds.cache.size');
  

чтобы исправить это, вы можете использовать async await

   app.get("/", async (req, res) => {
    const reducer = (acc, guildCount) => acc   guildCount;
    const results = await client.shard.fetchClientValues('guilds.cache.size');
    
    console.log(results)
    let guildCount  = results.reduce(reducer, 0)
    console.log(guildCount)

    renderTemplate(res, req, "index.ejs", { guildCount });
  });
  

для получения дополнительной информации о Array.prototype.reduce()

и асинхронное ожидание

Ответ №2:

Ваш второй подход правильный. С этого момента ваш метод должен быть асинхронным. Раз асинхронный, всегда асинхронный. Нет способа вернуть его к синхронному.

К счастью, .get() метод, в котором вы находитесь, уже асинхронный, поэтому просто переместите все после этого в .then() :

 app.get("/", (req, res) => {
  const reducer = (acc, guildCount) => acc   guildCount;
  client.shard.fetchClientValues('guilds.cache.size')
    .then(results => {
      console.log(results)
      let guildCount  = results.reduce(reducer, 0)
      console.log(guildCount);

      renderTemplate(res, req, "index.ejs", { guildCount });
    }).catch(console.error);
});
  

Комментарии:

1. Ваш catch() должен также ответить на запрос по крайней мере с ошибкой 500

Ответ №3:

reduce является ли Array helper, где result является promise ,

Таким образом, либо выполняйте свои операции внутри then , как

 client.shard.fetchClientValues('guilds.cache.size').then(results => results.reduce(reducer, 0))
  

или

Использовать async await

 const start = async () => {
 ...
 const results = await client.shard.fetchClientValues('guilds.cache.size')
 results.reduce(reducer, 0)
 ...
}
start()