【问题标题】:Access Body Param NodeJS Express访问正文参数 NodeJS Express
【发布时间】:2018-04-17 14:48:12
【问题描述】:

我有一条路线

router.post('/api/getSessionTimeOut', apiController.getSessionTimeOut);

这是在我的控制器中

function getSessionTimeOut(req, res) {

    res.send(req.body.session); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    var options =
    {
        method: 'POST',
        url: 'http://api/json',
        body:
        {
            id: 1,
            method: 'get',
            params: [
                {
                    url: '/cli/global/system/admin/setting'
                }
            ],
            session: req.params.session
        },
        json: true
    };

    request(options, function (error, response, body) {
        if (error) throw new Error(error);
        console.log(body, response);
        res.send(response.result);
    });
};

在通过 Postman

sessionbody 对路由进行 POST 后

我一直在得到

Red alert! Red alert!: TypeError: Cannot read property 'session' of undefined
    at getSessionTimeOut (/Users/doe/Desktop/express-app/controllers/api.js:50:23) at Layer.handle [as handle_request] (/Users/doe/Desktop/express-app/node_modules/express/lib/router/layer.js:95:5) at next (/Users/doe/Desktop/express-app/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/Users/doe/Desktop/express-app/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/Users/doe/Desktop/express-app/node_modules/express/lib/router/layer.js:95:5) at /Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:335:12) at next (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:275:10) at Function.handle (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:174:3) at router (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:47:12) at Layer.handle [as handle_request] (/Users/doe/Desktop/express-app/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:317:13) at /Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:335:12) at next (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:275:10) at serveStatic (/Users/doe/Desktop/express-app/node_modules/serve-static/index.js:75:16) at Layer.handle [as handle_request] (/Users/doe/Desktop/express-app/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:317:13) at /Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:335:12) at next (/Users/doe/Desktop/express-app/node_modules/express/lib/router/index.js:275:10) at expressInit (/Users/doe/Desktop/express-app/node_modules/express/lib/middleware/init.js:40:5)

index.js

import express from 'express'
import favicon from 'serve-favicon'
import path from 'path'
import bodyParser from 'body-parser'

// Controllers
import apiController from './controllers/api'

const router = express.Router();
const app = express();
const PORT = 3000;

//For public folder
app.use(express.static('public'))
app.use(router)
app.use('/images',express.static('images'))
app.use(favicon(path.join(__dirname,'public','favicon.ico')))
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

router.get('/', (req,res) => {
    res.send('Welcome to the backend provisioning daemon to program FortiManager')
});

// app.use( express.json());
app.use(express.urlencoded({extended: true}))
app.set('trust proxy', 'loopback');


//Fortinet
router.post('/api/getSessionTimeOut', apiController.getSessionTimeOut);
router.post('/api/login', apiController.login);

//Error handling function
app.use((err,req,res,next) => {
    console.error(err.stack)
    res.status(500).send(`Red alert! Red alert!: ${err.stack}`)
});

// app listen
app.listen(PORT, () => {
        console.log(`Your server is running on ${PORT}`)
    }
);

【问题讨论】:

  • 你配置body-parser了吗?
  • 我的index.js顶部有这个import bodyParser from 'body-parser'
  • @FranciscoMateo 我上传了我的index.js
  • 我想知道app.use(bodyParser.json()) 后跟app.use(bodyParser.urlencoded(..)) 的顺序是否重要。尝试在路由中直接使用bodyParser.json()作为中间件:router.post('/api...', bodyParser.json(), apiController.getSessionTimeout)
  • 尝试在const app = express();之后移动app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));

标签: json node.js express


【解决方案1】:

尝试移动

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

紧接着

const app = express();

为什么,因为在您的服务器上注册任何路由之前,您需要在您的服务器/应用程序上使用/注册middlewares。这将确保到达注册路由的每个请求首先通过body-parsers,并让body-parsers 以指定的数据结构或格式构造请求数据。

希望有帮助

谢谢

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    相关资源
    最近更新 更多