используя axios с мопсом для рендеринга - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь отобразить результаты вызова API, выполненного с помощью axios, в моем шаблоне pug, однако это не похоже на работу

// index.pug

extends layout

block content
  h1= 'Users List'
  p(id="users") Returned string: #{obj}

//allusers_controller

var axios = require('axios')

exports.DisplayData = function(req , res){

var obj;
var url = 'https://jsonplaceholder.typicode.com/todos/1'
axios.get(url).then(response => obj = response.id);
res.render('index.pug',{obj})
}

экспресс-маршрутизатор

var express = require('express');
var router = express.Router();

//main controller
var userController = require('../controllers/allusers_controller');

/* GET home page. */
router.get('/', userController.DisplayData);

module.exports = router;

oBj никогда не отображается. Что мне не хватает?

1 Ответ

0 голосов
/ 03 декабря 2018

Вы не совсем понимаете, как работают обещания, .then() является асинхронным, поэтому ваш код сразу переходит на res.render(), а obj равен undefined --- вам нужно изменить его на следующее, такres.render не вызывается до тех пор, пока ответ не будет получен путем помещения его в .then():

var axios = require('axios')

exports.DisplayData = function(req , res){    
  var url = 'https://jsonplaceholder.typicode.com/todos/1'
  axios.get(url).then(response => {
    let obj = response.id;
    res.render('index.pug',{obj})
  }
}

. Кроме того, вы можете альтернативно использовать async/await вместо .then(), например так:

exports.DisplayData = async function(req , res){
  try{
    var url = 'https://jsonplaceholder.typicode.com/todos/1'
    let response = await axios.get(url);
    let obj = response.id;
    res.render('index.pug',{obj});
  }catch(e){
    res.render('error.pug');
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...