使用Node JS我尝试进行简单的用户注册,将username
,email
和password
发送到'/newuser'
端点,这可以在user.js
。
标题已正确发送,我可以在控制台中看到它,但我无法访问我感兴趣的req.body
部分。我使用{{1如快递文档中所建议的那样表达中间件。
如果我打印body-parser
,则仅打印req.body
,如果我打印出整个 [object Object]
对象,我无法在任何地方看到参数,如果我尝试req
,当然JSON.parse(req.body)
出现了。有人能指出我正确的方向吗?
我这样做,它应该像这样工作(我也尝试过ajax,但它也不起作用,同样的错误)。但我发送的数据绝对是正确的,如果我在发送之前将其打印出来,那么它就是一个有效的JSON。
SyntaxError: Unexpected token o in JSON at position 1
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
}));
'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
module.exports = (app, partials) => {
require('./home')(app, partials);
require('./signup')(app, partials);
require('./user')(app, partials);
require('./404')(app, partials);
};
答案 0 :(得分:2)
因为你已经使用了body-parser的[object Object]
解析器,所以当你获得JSON时,已经解析(这就是为什么你看console.log
toString
{1}}它 - 当你将一个对象强制转换为字符串并且它没有为它定义任何特殊的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); // <====
});
上访问它们:
console.log
使用该代码,我在本地运行代码时会看到POSTed数据。
*除了正如JJJ在下面指出的那样,如果你真的使用[object Object]
,你应该看到对象的表示,而不仅仅是req.body
关于任何版本的Node。也许你正在使用其他强迫字符串的东西?或者使用未显示的中间件,可能会使用String(req.body)
覆盖{{1}}?
答案 1 :(得分:1)
您的实施是正确的。您应该只需从req.body
访问用户详细信息。
module.exports = (app, partials) => {
app.post('/newuser', (req, res, next) => {
console.log(req.header('Content-Type'))
console.log(req.body.email)
console.log(req.body.password)
console.log(req.body.username)
console.log(JSON.stringify(req.body, null, 2))
});
};
为了不打印[object Object]
,我使用JSON.stringify()
方法,因为req.body
已经是JavaScript对象。