将网址以外的参数发送到API

时间:2019-05-13 14:23:25

标签: reactjs api request

我使用advancedFetch向我的API发送请求。这有效,但是,我想知道是否可以发送参数而不在URL中定义参数。有什么聪明的方法吗?

我尝试进行研究,但不确定自己要使用的关键字是否正确。

这是我发出请求的地方(该值来自模式输入字段):

setNewUserName(userName) {
        this.setState({newUserName: userName});

        advancedFetch('/api/users', {
            method: 'POST',
            body: JSON.stringify({}),
            credentials: 'include',
            // I've tried sending the param here
            userName: userName,
            headers: {
                'Content-Type': 'application/json'
            }
        })
            .then(() => {
                this.loadUsers();
            })
            .catch(err => {
                //error handling
            });
    }

在我的控制器中,我定义了路由并实现了以下功能:

index.create = (req, res, next) => {
        let userName = req.params.userName;

        console.log(userName);

        user
            .create(userName)
            .then((response) => {
                res.send(response);
            })
            .catch((err) => {
                next(err);
            });
    };

router.post('/users', index.create);

然后在service.js中,将数据写入数据库:

create: function(userName){
            userName = userName

            return query(`INSERT INTO ${tableName} (user) VALUES (?, ?)`, [1, userName])
                .catch(err => {
                    app.logger.error('[Users] failed to create a user', err.message);
                    return Promise.reject(new Error('failed to create user'));
                });
        },

我总是得到一个未定义的用户名,是否必须创建一个以值结尾的路由?

2 个答案:

答案 0 :(得分:1)

您将收到未定义的userName,因为您发送的是带有JSON编码数据而不是URL参数的请求,并且相同的逻辑不适用于这种情况。

幸运的是,使用expressjs body-parser package可以轻松解决您的问题。它非常易于使用。

这是初始化它的方式:

<form ...>
    <select name="father_id">
        @foreach($fathers as $father)
            <option name="{{ $father->id }}">{{ $father->nom }}</option>
        @endforeach
    </select>

这是在路由器功能中读取“ userName”的方式:

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

var app = express()

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

顺便说一句,当您调用advancedFetch时,您实际上应该这样做:

index.create = (req, res, next) => {
        let userName = req.body.userName;

        console.log(userName);

        user
            .create(userName)
            .then((response) => {
                res.send(response);
            })
            .catch((err) => {
                next(err);
            });
    };

答案 1 :(得分:0)

是的,您实际上可以通过以下方式做到这一点:

在前端调用中,您可以像这样通过主体发送参数

body: JSON.stringify({userName: userName})

然后在您的控制器中,您要做的是直接从主体访问参数:

let userName = req.body.userName;

现在它不再是未定义的了:)