使用Node JS,我试图进行简单的用户注册,将用户名,电子邮件和密码发送到’/ newuser’端点,可以在user.js中看到.
标头已正确发送,并且我可以在控制台中看到它,但是我无法访问我感兴趣的req.body部分.我正在使用body-parser Express中间件,如表达.
如果我打印出req.body,则只打印[object Object],如果我打印出整个req对象,则在任何地方都看不到参数,并且如果我尝试JSON.parse(req.body),则当然是SyntaxError:出现JSON中位置1的意外令牌o.谁能指出我正确的方向?
我正在这样做,它应该像这样工作(我也用ajax尝试过,但是它也不起作用,同样的错误).但是我发送的数据绝对正确,如果我在发送之前将其打印出来,则它是有效的JSON.
var xhr = new XMLHttpRequest();
xhr.open('POST', '/newuser');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
console.log(xhr.responseText);
};
xhr.send(JSON.stringify({
username: data.username,
password: data.password,
email: data.email
}));
server.js
'use strict';
var express = require('express');
var hogan = require('hogan-express');
var http_module = require('http');
var cors = require('cors');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json('application/json'));
app.use(cors({credentials: true, origin: true}));
app.engine('html', hogan);
app.set('view engine', 'pug');
app.set('views', __dirname + '/views');
app.set('port', process.env.PORT || 4000);
app.use(express.static(__dirname + '/public'));
app.set('trust proxy', 1); // trust first proxy
const partials = {
header: 'partials/header',
footer: 'partials/footer'
};
require('./routes')(app, partials);
const http = http_module.Server(app);
http.listen(app.get('port'), () => {
console.info('Running on http://localhost:%s', app.get('port'));
});
module.exports = app;
routes.js
// Routes
module.exports = (app, partials) => {
require('./home')(app, partials);
require('./signup')(app, partials);
require('./user')(app, partials);
require('./404')(app, partials);
};
user.js
module.exports = (app, partials) => {
app.post('/newuser', (req, res, next) => {
console.log(req.header('Content-Type'))
console.log(req.body) // this prints [object Object]
console.log(JSON.parse(req.body)) // this throws SyntaxError: Unexpected token o in JSON at position 1
});
};
解决方法:
因为您使用了body-parser的json解析器,所以在获取JSON时就已经对其进行了解析(这就是为什么在console.log时看到[object Object]的原因-这是将对象强制转换为字符串时得到的结果)并且没有为它定义任何特殊的toString *).
要访问发送给您的对象的属性,请在req.body上访问它们:
app.post('/newuser', (req, res, next) => {
console.log(req.header('Content-Type'))
console.log(req.body.username); // <====
console.log(req.body.password); // <====
console.log(req.body.email); // <====
});
*除非JJJ在下面指出,否则,如果您确实使用console.log,则应该在几乎任何版本的Node中都看到对象的表示形式,而不是[object Object].也许您正在使用其他强制字符串的东西?还是没有使用中间件显示哪个可能用String(req.body)覆盖req.body?