nodejs почему мой код возвращает [object Object] вместо массива?

#javascript #node.js #arrays #express #promise

#javascript #node.js #массивы #выразить #обещание

Вопрос:

итак, я создаю веб-сайт и использую nodejs для выполнения множества вызовов api и заполнения всей информации. У меня есть домашняя страница с боковой панелью, где люди могут сортировать по «категориям». но когда я запускаю свой код вместо категорий, отображаемых в html, я получаю [object Object] . Я перепробовал целую кучу вещей, но все равно он только возвращает [object Object] . вот код:

index.js

 const express = require('express')
const router = new express.Router();
const categoriesFunction = require('../controllers/categories')
// get index page
router.get('', async (req, res) => {
    let requestString = '/apps'
    allApps = await openChannelRequest(requestString, req, res)

    await res.render('index', {
    categories: categoriesFunction,
  // this is where I try to add the categories to the homepage
})
})
  

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

categories.js

 const express = require('express')
const app = express()
var request = require('request');
var categoricalNames = []
var options = {
  'method': 'GET',
  'url': 'a working url',
  'headers': {
    'Authorization': 'working authorization'
  },
  'contentType': 'application/json'
};

var categoriesFunction = async() => request(options, function (error, response) {
return new Promise(function(resolve, reject){
  console.log('inside categories function')
  var categoryName = ''

  if(error || !response)
     {
        // report error
        reject(new Error('Try Again'));
     }
     else
     {
        //process response
        var body = JSON.parse(response.body); 
        var jsonResponse = body.values
        jsonResponse.forEach(function(obj) {
           // console.log(obj.label)
            categoryName = obj.label
           // JSON.stringify(categoryName)
            categoricalNames.push(categoryName)
        });
        categoricalNames.push({categoryName});
      //  console.log(categoricalNames)
        // report success
        JSON.stringify(categoricalNames)
        resolve(categoricalNames);
     }
})

});

module.exports.getPlaceDetails = categoriesFunction;
  

некоторое время я думал, что мой код работает не на консоли, а на консоли.журналы в моей categoriesFunction функции показывают, что массив заполняется правильно. он просто неправильно помещается в индекс. и попробовав этот метод на index.js страница ничего не делает для меня. все еще просто get [object Object] . не совсем уверен, почему. Кто-нибудь может мне это объяснить?

Спасибо!

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

1. [object Object] это то, что вы получаете, когда используете объект, в котором ожидается строка.

2. @Barmar итак, как мне заставить его возвращать не это? в частности, массив

3. Можете ли вы выяснить, где это происходит [object Object] ? Что такое response.body ?

4. @evolutionxbox Я не знаю, куда это превращается [object Object] . когда функция завершается, я могу вывести массив на консоль, поэтому я не уверен, где это происходит. response.body это большой объект json

5. Можете ли вы использовать журналы консоли или инструменты разработки, чтобы узнать, где это становится [object Object] ?

Ответ №1:

Я понял, что мне нужно было сделать. в основном нужно было написать более чистое обещание и убедиться, что не возвращать массив, а разрешать массив. а также должна была быть переменная в index.js что awaits результаты categoriesFunction()

вот что index.js похоже , что сейчас

 const express = require('express')
const router = new express.Router();
const categoriesFunction = require('../controllers/categories')
// get index page
router.get('', async (req, res) => {
    let requestString = '/apps'
    allApps = await openChannelRequest(requestString, req, res)

    const thing = await categoriesFunction()
    // this is important cause the method needs to be called before its inserted
    await res.render('index', {
        categories: thing,
  // this is where I try to add the categories to the homepage
})
})
  

и вот что categories.js файл выглядит следующим образом

 let categoriesFunction = function() {
return new Promise(resolve => 
request(options,
  (error, response) => {
    var categoryName = ''
    var body = JSON.parse(response.body); 
    var jsonResponse = body.values
    jsonResponse.forEach(function(obj) {
        categoryName = obj.label
        JSON.stringify(categoryName)
        categoricalNames.push(categoryName)
    });
    console.log(categoricalNames)
    resolve(categoricalNames)
   // now that this is resolved it can be returned 
  }
  ))
}