通过NodeJS

时间:2017-12-31 13:02:42

标签: javascript node.js express body-parser

使用Node JS我尝试进行简单的用户注册,将usernameemailpassword发送到'/newuser'端点,这可以在user.js。 标题已正确发送,我可以在控制台中看到它,但我无法访问我感兴趣的req.body部分。我使用{{1如快递文档中所建议的那样表达中间件。

如果我打印body-parser,则仅打印req.body,如果我打印出整个 [object Object]对象,我无法在任何地方看到参数,如果我尝试req,当然JSON.parse(req.body)出现了。有人能指出我正确的方向吗?

前端的JavaScript

我这样做,它应该像这样工作(我也尝试过ajax,但它也不起作用,同样的错误)。但我发送的数据绝对是正确的,如果我在发送之前将其打印出来,那么它就是一个有效的JSON。

SyntaxError: Unexpected token o in JSON at position 1

server.js

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
}));

routes.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;

user.js的

// Routes
module.exports = (app, partials) => {
  require('./home')(app, partials);
  require('./signup')(app, partials);
  require('./user')(app, partials);
  require('./404')(app, partials);
};

2 个答案:

答案 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对象。