正文解析器导致未定义
Body Parser resulting in undefined
尝试对 POST 请求的正文做一个简单的 console.log。我在我的 Chrome 控制台中看到带有正确数据的负载,但是当我尝试读取它时,出现以下错误:
express_1 | TypeError: Cannot read property 'exampleval' of undefined
我过去一直使用这个确切的逻辑,从来没有遇到过问题。
services/router.js
const express = require('express');
const http = require('http');
const bodyParser = require('body-parser');
var app = express();
// parse application/json
app.use(bodyParser.json());
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));
const router = new express.Router();
const employees = require('../controllers/employees.js');
//router.route('/employees').post(employees.post);
router.post('/employees', function (req, res) {
var exampleval = req.body.exampleval;
console.log(exampleval);
})
module.exports = router;
services/web-server.js
const http = require('http');
const express = require('express');
const webServerConfig = require('../config/web-server.js');
const bodyParser = require('body-parser');
const router = require('./router.js');
const morgan = require('morgan');
const cors = require('cors');
let httpServer;
function initialize() {
return new Promise((resolve, reject) => {
const app = express();
httpServer = http.createServer(app);
// Combines logging info from request and response
app.use(morgan('combined'));
// enable cors on all routes
app.use(cors())
// Mount the router at /api so all its routes start with /api
app.use('/api', router);
// Body Parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
httpServer.listen(webServerConfig.port)
.on('listening', () => {
console.log(`Web server listening on localhost:${webServerConfig.port}`);
resolve();
})
.on('error', err => {
reject(err);
});
});
}
module.exports.initialize = initialize;
function close() {
return new Promise((resolve, reject) => {
httpServer.close((err) => {
if (err) {
reject(err);
return;
}
resolve();
});
});
}
module.exports.close = close;
我相信这些是代码中仅有的 2 个相关部分。任何建议将不胜感激,因为我觉得我非常接近。我希望最终传递这些值以用于 SQL 查询。
中间件顺序很重要。
// Mount the router at /api so all its routes start with /api
app.use('/api', router);
// Body Parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
应该是
// Body Parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
// Mount the router at /api so all its routes start with /api
app.use('/api', router);
以便路由器仅在附加主体解析器后才接收请求(它可能想要处理)req.body
。
尝试对 POST 请求的正文做一个简单的 console.log。我在我的 Chrome 控制台中看到带有正确数据的负载,但是当我尝试读取它时,出现以下错误:
express_1 | TypeError: Cannot read property 'exampleval' of undefined
我过去一直使用这个确切的逻辑,从来没有遇到过问题。
services/router.js
const express = require('express');
const http = require('http');
const bodyParser = require('body-parser');
var app = express();
// parse application/json
app.use(bodyParser.json());
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));
const router = new express.Router();
const employees = require('../controllers/employees.js');
//router.route('/employees').post(employees.post);
router.post('/employees', function (req, res) {
var exampleval = req.body.exampleval;
console.log(exampleval);
})
module.exports = router;
services/web-server.js
const http = require('http');
const express = require('express');
const webServerConfig = require('../config/web-server.js');
const bodyParser = require('body-parser');
const router = require('./router.js');
const morgan = require('morgan');
const cors = require('cors');
let httpServer;
function initialize() {
return new Promise((resolve, reject) => {
const app = express();
httpServer = http.createServer(app);
// Combines logging info from request and response
app.use(morgan('combined'));
// enable cors on all routes
app.use(cors())
// Mount the router at /api so all its routes start with /api
app.use('/api', router);
// Body Parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
httpServer.listen(webServerConfig.port)
.on('listening', () => {
console.log(`Web server listening on localhost:${webServerConfig.port}`);
resolve();
})
.on('error', err => {
reject(err);
});
});
}
module.exports.initialize = initialize;
function close() {
return new Promise((resolve, reject) => {
httpServer.close((err) => {
if (err) {
reject(err);
return;
}
resolve();
});
});
}
module.exports.close = close;
我相信这些是代码中仅有的 2 个相关部分。任何建议将不胜感激,因为我觉得我非常接近。我希望最终传递这些值以用于 SQL 查询。
中间件顺序很重要。
// Mount the router at /api so all its routes start with /api
app.use('/api', router);
// Body Parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
应该是
// Body Parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
// Mount the router at /api so all its routes start with /api
app.use('/api', router);
以便路由器仅在附加主体解析器后才接收请求(它可能想要处理)req.body
。