【问题标题】:Express - GET API return always 200Express - GET API 总是返回 200
【发布时间】:2019-11-07 22:21:03
【问题描述】:

我写了一个GET API 打印传递的参数:

exports.agency_information = (req, res, next) => {
  console.log({param: req.params.usercode});
};

这是router

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

const AgencyController = require('../controllers/agency');

router.get('/:usercode', AgencyController.agency_information);

module.exports = router;

但我不明白为什么当我调用 api 时总是返回 200 OK 而在 Postman 中这是返回:

<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8" />
    <link rel="icon" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta name="description" content="Fare la constatazione amichevole non è mai stato così facile" />
    <link rel="apple-touch-icon" href="logo192.png" />
    <link rel="manifest" href="/manifest.json" />
    <title>ConstaFAST</title>
    <link href="/static/css/2.0624914a.chunk.css" rel="stylesheet">
    <link href="/static/css/main.02a2fc0a.chunk.css" rel="stylesheet">
</head>

<body><noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <script>
        !function(i){function e(e){for(var r,t,n=e[0],o=e[1],u=e[2],l=0,f=[];l<n.length;l++)t=n[l],Object.prototype.hasOwnProperty.call(p,t)&&p[t]&&f.push(p[t][0]),p[t]=0;for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(i[r]=o[r]);for(s&&s(e);f.length;)f.shift()();return c.push.apply(c,u||[]),a()}function a(){for(var e,r=0;r<c.length;r++){for(var t=c[r],n=!0,o=1;o<t.length;o++){var u=t[o];0!==p[u]&&(n=!1)}n&&(c.splice(r--,1),e=l(l.s=t[0]))}return e}var t={},p={1:0},c=[];function l(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return i[e].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.m=i,l.c=t,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(r,e){if(1&e&&(r=l(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)l.d(t,n,function(e){return r[e]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var r=this.webpackJsonpwww=this.webpackJsonpwww||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var o=0;o<r.length;o++)e(r[o]);var s=n;a()}([])
    </script>
    <script src="/static/js/2.9ed2bde4.chunk.js"></script>
    <script src="/static/js/main.ea8659b8.chunk.js"></script>
</body>

</html>

无论有无任何参数,结果都是一样的。

服务器代码

const express = require('express');
const app = express();
const path = require('path');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
require('dotenv').config()

const agencyRoutes = require('./api/routes/agency');
const companyRoutes = require('./api/routes/company');

const port = process.env.PORT || 3000;

mongoose.connect(process.env.DB_CONNECT, {
  useCreateIndex: true,
  useNewUrlParser: true,
  useUnifiedTopology: true
}, () => console.log('Connect to the database'));

mongoose.Promise = global.Promise;

app.use(morgan('dev'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.use( (req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header(
    'Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept, Authorization'
  );

  if ( req.method === 'OPTIONS' ) {
    res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET');
    return res.status(200).json({});
  }

  next();
});

app.use(express.static(path.resolve(__dirname, '../www', 'build')));
app.get('*', (req, res) => {
  res.sendFile(path.resolve(__dirname, '../www', 'build', 'index.html'));
});

app.use('/api/agency', agencyRoutes);
app.use('/api/company', companyRoutes);

app.use( (req, res, next) => {
  const error = new Error('Not found');
  error.status = 404;
  next(error);
});

app.use( (error, req, res, next) => {
  res.status(error.status || 500);
  res.json({
    error: {
      message: error.message
    }
  });
});

app.listen(port, () => console.log(`Server up and running on port ${port}`));

【问题讨论】:

    标签: node.js api express


    【解决方案1】:

    首先从服务器发送响应。

    exports.agency_information = (req, res, next) => {
        console.log({param: req.params.usercode});
        res.send('send something from server');
    };
    

    现在从邮递员那里调用你的 api

    例如使用这个

    http://localhost:3000/api/agency/1234
    

    在上面:将 yourportnumber 替换为您的服务器所在的端口 在跑。 1122 是您发送的参数,它 在控制台中打印。

    如果这是您的默认路由,则调用它,您会在邮递员中看到响应,并在控制台中打印参数。

    更新您的服务器代码将 api 路由向上移动 app.get(*) 必须是最后一个。因此,您在邮递员中获得了 html 页面。

    这是更新的服务器代码

    const express = require('express');
    const app = express();
    const path = require('path');
    const morgan = require('morgan');
    const bodyParser = require('body-parser');
    const mongoose = require('mongoose');
    require('dotenv').config()
    
    const agencyRoutes = require('./api/routes/agency');
    const companyRoutes = require('./api/routes/company');
    
    const port = process.env.PORT || 3000;
    
    mongoose.connect(process.env.DB_CONNECT, {
      useCreateIndex: true,
      useNewUrlParser: true,
      useUnifiedTopology: true
    }, () => console.log('Connect to the database'));
    
    mongoose.Promise = global.Promise;
    
    app.use(morgan('dev'));
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    
    app.use( (req, res, next) => {
      res.header('Access-Control-Allow-Origin', '*');
      res.header(
        'Access-Control-Allow-Headers',
        'Origin, X-Requested-With, Content-Type, Accept, Authorization'
      );
    
      if ( req.method === 'OPTIONS' ) {
        res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET');
        return res.status(200).json({});
      }
    
      next();
    });
    
    app.use('/api/agency', agencyRoutes);
    app.use('/api/company', companyRoutes);
    
    app.use(express.static(path.resolve(__dirname, '../www', 'build')));
    app.get('*', (req, res) => {
      res.sendFile(path.resolve(__dirname, '../www', 'build', 'index.html'));
    });
    
    app.use( (req, res, next) => {
      const error = new Error('Not found');
      error.status = 404;
      next(error);
    });
    
    app.use( (error, req, res, next) => {
      res.status(error.status || 500);
      res.json({
        error: {
          message: error.message
        }
      });
    });
    
    app.listen(port, () => console.log(`Server up and running on port ${port}`));
    

    【讨论】:

    • 是的,但问题仍然存在! res.send('send something from server'); 不能解决问题!
    • 您能告诉我您是如何从 Postman 调用 API 的吗?并在你调用这个路由器的地方显示代码。
    • 这是 Postam 调用 http://localhost:3000/api/agency/1234GET 方法。我只是用服务器的 che 代码更新 answare。
    • 查看更新的答案,因为 app.get(*) 路由首先出现此问题。接收所有获取请求并完成它们。
    【解决方案2】:

    看起来这可能是您的应用程序的默认页面,即使没有传递任何内容。您说无论参数如何,您的输出都是相同的。您似乎被困在输出默认页面上。这是有道理的,因为意大利人说“Fare la constatazione amichevole non è mai stato così facile” 做出友好的声明从未如此简单。我会检查默认设置检查是否可以允许 java 脚本,然后检查它是否有效。

    因为这是 javascript,你可能有一些东西阻止了 java 脚本允许它工作,当你的 java 脚本不工作时,这可能是默认页面。

    exports.agency_information = (req, res, next) => {
      console.log({param: req.params.usercode});
    };
    

    您可以尝试使用 来检查js是否也被禁用。

    How to check javascript is enabled or not in Node JS server side code <noscript> <meta http-equiv=refresh content='0; url=http://your.domain/noscript' </noscript>

    【讨论】:

    • 如果我传递一个参数,我有同样的问题,它不打印参数
    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 2019-12-16
    • 2019-03-02
    • 1970-01-01
    • 2022-10-04
    • 2022-10-20
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多