Express.js форма поиска не возвращает ответ от api

#javascript #express #post #get #amadeus

#javascript #экспресс #Публикация #получить #amadeus

Вопрос:

Я пытаюсь создать простую форму поиска в Express, используя Amadeus api. Я вижу данные, возвращенные на консоль, но после нажатия кнопки поиска на моем index.js страница продолжает выдавать меня http://localhost:3001/results/undefined?q=CPTamp;submit= и не рассасывается. Чего мне здесь не хватает, пожалуйста? Как мне получить доступ к ответу в форме ключа для создания моей страницы результатов? Любая помощь будет принята с благодарностью!

app.js

 require('dotenv').config();
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');

const indexRouter = require('./routes/index');
const postRouter = require('./routes/post');
const resultsRouter = require('./routes/results');
const usersRouter = require('./routes/users');

const app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

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('/', postRouter);
app.use('/', resultsRouter);
app.use('/users', usersRouter);

module.exports = app;
  

Index.js

 extends layout

block content
  h1= title
  div.container-fluid
    div.row.justify-content-center
        p Find Your Dream Kruger Safari Package!
          form.form-inline.my-2.my-lg-0#searchBox(
                action='/results/'     q
                method='GET'
                )
                  input.form-control.mr-sm-2(type='text', placeholder='City Code ie. LON, JHB, CPT', aria-label='Search', id='q' name='q' required)
                  button.btn.btn-success.my-2.my-sm-0(type='submit' id='submit' name="submit") Search   
  

results.js

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

router.get('/results/:q', (req, res) => {
  const q = req.query.q;
  // const result = ;
  // q = JSON.stringify(q);
  // console.log(result);
  const searchAmadeus = require('../controllers/amadeusControl.js');
  searchAmadeus.findNew(q, (err, docs) => {
    if (!err) {
      res.render('results', {
        title: 'We Found Some Great Deals',
        list: docs,
      });
    } else {
      console.log('Error  finding record :'   err);
    }
  });
});

module.exports = router;
  

post.js

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

    router.post('/results/:q', function(req, res) {
      const q = req.body.q;
      res.send(q);
      // res.send(q);
      //console.log(q);
    });
    
    module.exports = router;
  

результаты.pug

 extends layout

block content
  h1= title
  p Results  
  div.find test #{body}
  div.container
    div.row
      div.col-sm
        p left col content
      div.col-sm
        tbody
          each docs in list
            tr
              td= doc
  

amadeusControl.js

 module.exports = {
  findNew: function(q) {
    // const bodyParser = require('body-parser');
    // initialize the client and authenticate
    const Amadeus = require('amadeus');
    // console.log(process.env.AMADEUS_CLIENT_ID);
    const amadeus = new Amadeus({
      'clientId': process.env.AMADEUS_CLIENT_ID,
      'clientSecret': process.env.AMADEUS_CLIENT_SECRET,
    });

    // Get list of Hotels by city code
    amadeus.shopping.hotelOffers.get({
      cityCode: q,
    }).then(function(response) {
      // console.log(response.body); // => The raw body
      console.log(response.result); // => The fully parsed result
      // console.log(response.data); // => The data attribute taken from the result
      docs = response.result;
    }).catch(function(error) {
      console.log(error.response); // => The response object with (un)parsed data
      console.log(error.response.request); // => The details of the request made
      console.log(error.code); // => A unique error code to identify the type of error      // END Do something with the returned data.
    });

  }};
  

Ответ №1:

Прежде всего, вы должны получить доступ к :q параметру, используя req.params объект, а не req.body .

Но, я думаю, вы хотите использовать req.query вместо этого.

Экспресс-запрос.запрос документов

Если вы хотите использовать req.body , вам нужно будет изменить свою форму на POST-запрос вместо GET-запроса.

Комментарии:

1. Большое спасибо, я изменил req.body.q на req.params.q который выдает q=JHB submit= в консоли, но не передает q на res.render('results', , поэтому страница просто зависает со статусом 400 data: undefined

2. @ZADorkMan , эта ошибка может быть вызвана тем, что вы явно не возвращаетесь data из функции amadeus (я также не вижу объявления этой переменной, поэтому вам следует добавить и это) . Также в вашем results.pug вы определяете переменную docs in list , а затем используете doc в td элементе. Если у вас все еще возникают проблемы, я предлагаю открыть новый вопрос об этой конкретной проблеме.

3. Спасибо @Phi12ip, я рвал на себе волосы и попробую сейчас!