我使用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'));
});
},
我总是得到一个未定义的用户名,是否必须创建一个以值结尾的路由?
答案 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;
现在它不再是未定义的了:)