Express.js在路由之间传递API数据时遇到问题

时间:2019-11-15 08:33:43

标签: node.js express routes pass-data express-router

我不知道如何在路线之间传递数据。我已经从API成功获取了json数据,但是现在我想将该数据传递给index.hbs,但是我不知道如何。我将所有代码都放在下面。

主文件 app.js

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');

const app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

indexRouter文件 route / index.js

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

const index = require('../controllers/index');

router.get('/', index.index);
router.post('/', index.recieve_post);


module.exports = router;

控制器文件 controllers / index.js

const request = require('request');
let objData = {};

exports.index = function (req, res, next) {
  res.render('index', {
    title: 'Express'
  });
}

exports.recieve_post = function(req, res, next) {
  const data = req.body;
  res.redirect('/');
  getData(data);
}

function getData(data){
  const options = {
     method: 'POST',
     url: 'https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/pricing/v1.0',
     headers: {
       'x-rapidapi-host': 'skyscanner-skyscanner-flight-search-v1.p.rapidapi.com',
       'x-rapidapi-key': 'API_KEY',
       'content-type': 'application/x-www-form-urlencoded'
     },
     form: {
       inboundDate: data.inboundDate,
       cabinClass: data.cabinClass,
       children: '0',
       infants: '0',
       country: 'US',
       currency: 'USD',
       locale: 'en-US',
       originPlace: data.originPlace,
       destinationPlace: data.destinationPlace,
       outboundDate: data.outboundDate,
       adults: '1'
     }
   };
   request(options, function (error, response, body) {
    if (error) throw new Error(error);
     const session_key = response.headers.location.split('/')[7];
     getSearchedFlights(session_key);
   });
}

function getSearchedFlights(key){
  const options = {
    method: 'GET',
    url: 'https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/pricing/uk2/v1.0/'+key,
    qs: {pageIndex: '0', pageSize: '10'},
    headers: {
      'x-rapidapi-host': 'skyscanner-skyscanner-flight-search-v1.p.rapidapi.com',
      'x-rapidapi-key': 'API_KEY'
    }
  };
  request(options, function (error, response, body) {
    if (error) throw new Error(error);
    objData = JSON.parse(body);
    console.log(objData);
  });
}

++ Template Engine文件** views / index.hbs

<h1>{{title}}</h1>

<form class="form" action="/" method="POST">
    <input type="text" name="inboundDate" placeholder="inboundDate">
    <input type="text" name="cabinClass" placeholder="cabinClass">
    <input type="text" name="originPlace" placeholder="originPlace">
    <input type="text" name="destinationPlace" placeholder="destinationPlace">
    <input type="text" name="outboundDate" placeholder="outboundDate">
    <input type="submit" name="submit" value="search">
</form>

<!-- I want to get json data here -->
<p>{{objData}}</p>

1 个答案:

答案 0 :(得分:3)

  1. 您在Express Server控制台中得到了什么?您得到回应了吗?您已在getSearchedFlights函数中打印的那个。
  2. 如果您获得有效的控制台日志输出,那么您需要做的就是确保您的响应到达视图层(您的.hbs模板)。
  3. 因此,您在调用.render时必须通过参数将响应从skyscanner api传递到hbs模板。 您可以将其用作参考
    https://medium.com/programming-sage/handlebars-in-node-js-tutorial-a30a41fc6206 上面将向您展示如何做。

现在,您对获得的响应不做任何事情。 也是这两行的顺序   res.redirect('/');   getData(data);

应该相反

您应该从getData函数返回数据并将其传递到模板中。

teamcity.vcsTrigger.runBuildInNewEmptyBranch

希望这会有所帮助。