Поэтому я создаю веб-сайт и использую 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;

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

Благодарность!

0
zamanada 15 Окт 2020 в 01:55

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
})
})

А вот как выглядит файл category.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 
  }
  ))
}
1
zamanada 15 Окт 2020 в 00:32