Почему переменная, переданная в объекте locals, становится неопределенной при получении файла e js? - PullRequest
0 голосов
/ 14 марта 2020

Я новичок в Node и Express. Я использовал DOG API для получения объекта, содержащего все породы собак, и затем рендерил их, используя e js.
Ниже приведен мой код:

const express = require('express');
const path = require('path');
const port = 8000;

const app = express();

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.get('/', function (req, res) {
    var request = require('request');
    var obj;
    request('https://dog.ceo/api/breeds/list/all', function (error, response, body) {
        if (!error && response.statusCode == 200) {
            obj = JSON.parse(body);
            obj = obj.message;
            console.log("hello ", obj);
        }
    });
    res.render('index', { title: 'Hey', dogBreeds: obj });
});

app.listen(port, (err) => {
    if(err){
        console.log("ERROS: ",err);
    }
    console.log("Express server is runnig on port: ",port);
});

У меня есть папка views, которая содержит index.ejs file
Ниже мой index.ejs file:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>
        <%= title  %>
    </title>
</head>
<body>
   <h1>How r u?</h1>
    <p>
        <%= dogBreeds["waterdog"] %>
    </p>
</body>
</html>


Когда я набрал: http://localhost:8000/ в браузере и запустил сервер. Вывод на консоль:
hello , за которым следует полный извлеченный объект

Но в файле ejs, когда я пытаюсь получить свойства объекта dogBreeds, он говорит:
Невозможно прочитать свойство ' имя-свойства ' из неопределенного

Почему это происходит? ИЛИ Я что-то не так делаю?

Заранее благодарим за любую помощь, которую вы можете оказать.

1 Ответ

1 голос
/ 14 марта 2020

Когда вы выполняете асинхронные операции, такие как отправка запроса, на их решение уходит некоторое время (даже если сервер очень быстро сообщает о том, что функция обратного вызова не выполняется немедленно). В вашем маршруте get вы отправляете запрос и пытаетесь немедленно визуализировать файл e js. Вместо этого вам следует подождать ответа.

Переместите свою часть рендеринга в блок, в который вы получаете ответ.

app.get('/', function (req, res) {
    var request = require('request');
    var obj;
    request('https://dog.ceo/api/breeds/list/all', function (error, response, body) {
        if (!error && response.statusCode == 200) {
            obj = JSON.parse(body);
            obj = obj.message;
            console.log("hello ", obj);
        }
    });
    res.render('index', { title: 'Hey', dogBreeds: obj });
});

должен быть:

app.get('/', function (req, res) {
    var request = require('request');
    var obj;
    request('https://dog.ceo/api/breeds/list/all', function (error, response, body) {
        if (!error && response.statusCode == 200) {
            obj = JSON.parse(body);
            obj = obj.message;
            console.log("hello ", obj);
            res.render('index', { title: 'Hey', dogBreeds: obj });
        }
    });
});

Это позволит гарантировать, что вы выполняете рендеринг только после получения ответа.

...