在 Express HTTP 请求中将数据作为正文传递

问题描述 投票:0回答:2

我正在用node.js开发一个网站,我正在尝试分离前端和后端。为此,我使用 http.request 发送/询问后端数据,但无法在正文中传递数据。我把代码放在下面来澄清问题。

/**
 * FRONTEND
 * POST /
 * Login (Home)
 */
router.post('/home', async (req, res) => {
    try {
        const { mail, password } = req.body;

        var datas = querystring.stringify({
            "mail": mail,
            "password": password
        });

        var options = {
            host: 'localhost',
            port: 3000,
            path: '/login',
            method: 'POST'
        };

        var data;
        var request = http.request(options, function(r) {
            r.setEncoding('utf8');
            if(r.statusCode === 200){
                var bodyChunks = [];
                r.on('data', function(chunk) {
                    bodyChunks.push(chunk);
                }).on('end', function() {
                    data = bodyChunks; //Buffer.concat(bodyChunks);
                    res.cookie('token', data, { httpOnly: true });
                    res.redirect('/');
                });
            } else {
                console.log('Not working, code: '+r.statusCode);
            }
        });
        request.write(datas);
        request.end();

        request.on('error', function(e) {
            console.log('ERROR: ' + e.message);
        });
    } catch (error) {
        console.log(error);
        res.status(401).json({message:'Invalid credentials'});
    }
});
/**
 * BACKEND
 * Check Login
 */
const authMiddleware = (req, res, next) => {
    const token = req.body.token;
    console.log(token); //it prints 'undefined'

    if(!token) {
        return res.status(401).send('Unauthorized access');
    }

    try {
        const decoded = jwt.verify(token, jwtSecret);
        req.userId = decoded.userId;
        next();
    } catch (error) {
        res.status(401).send('Unauthorized access');
    }
}

/**
 * BACKEND
 * GET /
 * Dispense
 */
router.get('', authMiddleware, async (req, res) => {
   try {
       const data = await Dispensa.find();
       res.send(data).status(200);
   } catch (error) {
       console.log(error);
   }
});

正如我之前所说,我尝试在 http 请求正文中传递数据,但在后端我没有收到任何内容。

编辑 为了简化起见,我正在尝试进行此测试,但仍然不起作用。

//index.js
//...
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
//...
app.post(function (req, res) {
    res.json(req.body)
});
//BACKEND - Test
router.post('', async (req, res) => {
    try {
        console.log(req.body.token);
        res.send("TEST").status(200);
    } catch (error) {
        console.log(error);
    }
});
//FRONTEND - Test
router.get('', async (req, res) => {
    try {
        var request = http.request(options, function(res) {
            if(res.statusCode === 200){
                var bodyChunks = [];
                var data;
                res.on('data', function(chunk) {
                    bodyChunks.push(chunk);
                }).on('end', function() {
                    data = Buffer.concat(bodyChunks);
                    console.log(data);
                });
            }
        });
        // request.write(body);
        request.end("token:ABCDEFGH");

        request.on('error', function(e) {
            console.log('ERROR: ' + e.message);
        });
    } catch (error) {
        console.log(error);
    }
});
node.js http httprequest body-parser
2个回答
0
投票

我想你正在寻找BodyParser,req.body在中间件之后可用

const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.json());

0
投票

我认为你应该在初始化文件中添加body-praser,即app.js或server.js,无论你命名它什么。它是一个中间件,可以解析 request.body 中的任何内容

var express = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

app.post(function (req, res) {
  res.json(req.body)
})
© www.soinside.com 2019 - 2024. All rights reserved.