节点 JS EXPREES 未被判回调



我正在做一个个人项目,我对nodeJS没有太多经验,这个想法是带来一个远程获取一些数据并生成一些统计数据的JSON,我正在做一些测试在完全开始项目之前,我在回调方面遇到了问题。

服务器.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
};

路线.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 文档中可用。

您的模块使用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);关闭它。

非常感谢您,我正在工作,现在我更好地了解了异步函数的工作原理。我在这里留下了我问题的完整解决方案,以防将来有人需要它:

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

非常多!

最新更新