узел JS expreess НЕИЗВЕСТНЫЙ ВЫЗОВ - PullRequest
0 голосов
/ 19 октября 2018

Я работаю над личным проектом, и у меня нет большого опыта работы с nodeJS, идея состоит в том, чтобы создать JSON, который удаленно взял некоторые данные и сгенерировал некоторую статистику, я делаю некоторые тесты, прежде чем начать полностью в проекте иУ меня проблемы с обратным вызовом.

server.js работает правильно,

Мой модуль имеет следующий вид:

const extjson = require('remote-json');

//---------------------API CONFIG--------------------------
//apikey
const apikey ="xxxxxxxxxxxxxxxxxxxxx";

function get_sum_id(sumname){
  const urlsumbySumName = "https://la2.api.riotgames.com/lol/summoner/v3/summoners/by-name/" + sumname + "?api_key=" + apikey;
  var id;
  extjson(urlsumbySumName).get((err, res, body)=> {
    id = body.id;
    });
  return id;
}
module.exports = {get_sum_id

  };

, а route.js имеет следующий вид:

const riot = require('./rapi.js');
const express = require('express');


//---------------------------------------------------------

const router = express.Router();
//Jtask -- task remote json
//const Task = require('../models/Task'); // taskdb

router.get('/',async (req, res) => {
  res.render('index');
});

router.post('/profile', (req,res)=>{
  const sum = req.body.summoners; 
  console.log(riot.get_sum_id(sum));


  res.render('profile',{sum});
});
module.exports = router;

Я хочу показать этот идентификатор консолью, и он возвращает неопределенное значение, идея состоит в том, чтобы передать это значение в рендер ниже, чтобы оно было доступно в документе EJS.Я ценю, если вы можете мне помочь, СПАСИБО!

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

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

//rapi.js

    const extjson = require ('remote-json');

    //---------------------API CONFIG--------------------------
    //apikey
    const apikey ="RGAPI-77f658f1-ff2b-40e7-a74c-47f7510c8dac";
    //trayendo los datos desde riot


    function  get_sum_id(sumname, callback){
      const urlsumbySumName = "https://la2.api.riotgames.com/lol/summoner/v3/summoners/by-name/" + sumname + "?api_key=" + apikey;
      extjson(urlsumbySumName).get(callback)
      }

    module.exports = { get_sum_id };

//routesapp.js
const riot = require('./rapi.js');
const express = require('express');
//---------------------------------------------------------
const router = express.Router();

router.get('/',async (req, res) => {
  res.render('index');
});

router.post('/profile', (req, res, next)=>{
  const sum = req.body.summoners;

  riot.get_sum_id(sum,function (err, resp, body){
    console.log(body.id);
    //responces....
    res.render('profile',{sum, id: body.id})
  });

});
module.exports = router;

TNX очень сильно!

0 голосов
/ 20 октября 2018

Ваш модуль выполняет асинхронный вызов на другой сервер с remote-json.Это означает, что обратный вызов будет вызван только после запроса к этому другому серверу.Таким образом, эта строка return id; читается перед этой строкой id = body.id;.

Один из способов исправить это обеспечить обратный вызов из того места, где вы вызываете функцию вашего модуля.

На основеваш код вы можете сделать что-то вроде этого:

// module.js
const extjson  = require('remote-json');

const apikey ="xxxxxxxxxxxxxxxxxxxxx";

function get_sum_id (sumname, callback) {
  const urlsumbySumName = "https://la2.api.riotgames.com/lol/summoner/v3/summoners/by-name/" + sumname + "?api_key=" + apikey;
  extjson(urlsumbySumName).get(callback);
}

module.exports = { get_sum_id };

// app.js
const riot = require('./rapi.js');
const router = express.Router();

router.post('/profile', function(req, res, next) {
  riot.get_sum_id(req.body.summoners, function (err, resp, body) {
    console.log(body);
    res.json(body); // Response here
  });
});
module.exports = router;

Теперь запросы к вашему серверу будут в ожидании, пока ваш обратный вызов не закроет его с помощью res.json(body);.

...