【问题标题】:Express.js search form not returning response from apiExpress.js 搜索表单未从 api 返回响应
【发布时间】:2020-10-23 22:09:21
【问题描述】:

我正在尝试使用 Amadeus api 在 Express 中构建一个简单的搜索表单。我可以看到返回到控制台的数据,但是单击 index.js 上的搜索按钮后,页面不断给我http://localhost:3001/results/undefined?q=CPT&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;

索引.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.
    });

  }};

【问题讨论】:

    标签: javascript express post get amadeus


    【解决方案1】:

    首先,您将使用req.params 对象而不是req.body 访问:q 参数。

    但是,我想你想改用req.query。

    Express req.query docs

    如果您想使用req.body,您需要将表单更改为 POST 请求而不是 GET 请求。

    【讨论】:

    • 非常感谢,我将req.body.q 更改为req.params.q,这会在控制台中生成q=JHB submit=,但没有将q 传递给res.render('results', ,因此页面只是挂起,状态为400 @987654331 @
    • @ZADorkMan ,这个错误可能是因为您没有从 amadeus 函数显式返回 data (我也没有看到这个变量的声明,所以您也应该添加它)。同样在您的 results.pug 中,您定义变量 docs in list ,然后在 td 项目中使用 doc 。如果您仍然遇到问题,我建议您针对此特定问题提出一个新问题。
    • 谢谢@Phi12ip,我一直在拔头发,现在就试试!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多