#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
это большой объект json5. Можете ли вы использовать журналы консоли или инструменты разработки, чтобы узнать, где это становится
[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
}
))
}