节点JS表示未定义的回叫

时间:2018-10-19 17:42:46

标签: javascript node.js json express ejs

我正在做一个个人项目,并且我对nodeJS没有太多经验,我的想法是带来一个JSON,该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

  };

,routes.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;

我想通过控制台显示该id并返回未定义,其想法是将该值传递给下面的渲染器,以使其在EJS文档中可用。感谢您能帮助我,谢谢!

2 个答案:

答案 0 :(得分:1)

您的模块使用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);将其关闭为止。

答案 1 :(得分:1)

非常感谢我的工作,现在我对异步函数的工作方式有了更好的了解。我将完整的解决方案留在这里,以防将来有人需要它:

//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!