Отправить параметр не в URL к API - PullRequest
0 голосов
/ 13 мая 2019

Я отправляю запрос в мой API с помощью AdvancedFetch.Это работает, однако, я хочу знать, возможно ли отправить параметр без определения его в 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);

И затем вmy 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 ]

1 голос
/ 13 мая 2019

Вы получаете userName как неопределенное, потому что вы отправляете запрос с данными в кодировке JSON, а не с параметрами URL, и та же логика не применима для этого случая.

К счастью, есть простоеспособ решить вашу проблему, используя expressjs body-parser package .Его очень просто использовать.

Вот как вы его инициализируете:

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

var app = express()

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

И вот как вы должны прочитать «userName» в функции маршрутизатора:

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

И, кстати, когда вы вызываете advancedFetch, вы должны делать это:

body: JSON.stringify({newUserName: userName}),
0 голосов
/ 13 мая 2019

Да, вы можете сделать это так:

В вызове веб-интерфейса вы можете отправить параметр через тело следующим образом:

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

А затем в вашем контроллере вы хотите получить прямой доступ к параметру из тела:

let userName = req.body.userName;

А теперь оно больше не определено:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...