#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',
, поэтому страница просто зависает со статусом 400data: undefined
2. @ZADorkMan , эта ошибка может быть вызвана тем, что вы явно не возвращаетесь
data
из функции amadeus (я также не вижу объявления этой переменной, поэтому вам следует добавить и это) . Также в вашемresults.pug
вы определяете переменнуюdocs in list
, а затем используетеdoc
вtd
элементе. Если у вас все еще возникают проблемы, я предлагаю открыть новый вопрос об этой конкретной проблеме.3. Спасибо @Phi12ip, я рвал на себе волосы и попробую сейчас!