访问 NodeJS Express 中的请求体参数

3
我有一个路由。
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进行POST请求时,将session作为body发送到路由。如下图所示:enter image description here但我一直收到以下错误信息:
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 吗? - Cisco
@FranciscoMateo 我上传了我的 index.js 文件。 - code-8
尝试将 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); 放在 const app = express(); 之后。 - Muhammad Usman
让我知道结果是什么 :p - Muhammad Usman
对于这个问题,我认为你可以通过将body parser注入放在app.use(router)之后来解决它,如果你将它放在app.use(router)之前,它应该会再次出现。 - agm1984
显示剩余5条评论
1个回答

1

请将以下代码:

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

放在

const app = express();

后面。为什么呢?因为您需要在注册任何路由之前在服务器/应用程序上使用/注册中间件。这将确保通过body-parsers传递到已注册路由的每个请求首先经过处理,并允许body-parsers按其指定的数据结构或格式构造请求数据。

希望这能帮到您。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接