我试图向后端发送一个axios
请求,但最终却得到一个空的body
,我不明白为什么这样做。
这是请求的代码:
axios.post('/register', {email: email, password: password, username: username, company: company}).then(response => {
console.log(response.data);
});
这是后端的代码:
authRouter.post('/register', (request, response) => {
console.log(request.body);
});
这将输出一个空的request.body
。我还检查了发送的JSON
,它根本不是空的。有没有办法在发送之前查看请求的形式?
authRouter
是一个module.export
,正由主app
模块使用。此app
模块具有以下配置:
app.use(express.static("public"));
app.use(session({ secret: "shh", resave: false, saveUninitialized: false }));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(passport.initialize());
app.use(passport.session());
app.set('views', __dirname + '/views');
app.set('view engine', 'pug');
app.use(authRouter);
https.createServer({key: fs.readFileSync('ssl/key.pem'), cert: fs.readFileSync('ssl/cert.pem')}, app).listen(8080);
答案 0 :(得分:5)
问题来自body-parser
要一个x-www-form-urlencoded
请求,而我没有提供。我已经为其设置了axios请求的标头,并且代码如下所示:
axios.post( '/register',
{email: email, password: password, username: username, company: company},
{headers: {'Content-Type': 'application/x-www-form-urlencoded'}}).then(response => {
console.log(response.data);
});
答案 1 :(得分:1)
在我的情况下,我在axios标头中声明了“ Content-Type”:“ application / json”。为简便起见,我在axios的全局属性中声明。
以这种方式
axios.defaults.headers.common = {
"Content-Type": "application/json"
}
现在正在工作
答案 2 :(得分:0)
要解决我的问题,我被限制要做此事
let config = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}
}
let params = new UrlSearchParam();
params.append('var1', 'val1');
params.append('var2', 'val2');
//Finally
axios.post('gotourl', params, config).then( ( response ) => {
console.log(response.data);
});
答案 3 :(得分:0)
您可以使用qs序列化有效负载。
安装:npm i qs
const qs = require('qs');
axios.post('/post/submit-timesheet', qs.stringify({your: 'data'}))
.then(res => console.log(res))
.catch(err => console.log(err));
希望这会有所帮助。 :)
答案 4 :(得分:0)
我刚刚遇到了相同的问题,而我的问题出在 transformRequest 函数中:它返回的数据没有JSON.string化。这就是transformRequest函数的样子(在我的案例中,记录器使用TypeScript):
const requestLogger = <D>(url: string, methodName: string) => (data: D): string => {
console.log(`Request ${methodName} ${url}\n Body:,`, data)
return JSON.stringify(data);
}
最后我的post静态方法看起来像这样:
static baseHeaders: Object = {
"Content-Type": "application/json"
};
static post<T, B>({
url,
body,
params = {},
headers = {},
needThrowError = false,
}: IPost<B>): Promise<void | AxiosResponse<T>> {
const rest = axios.create({
params,
baseURL: this.baseUrl,
headers: {...this.baseHeaders, ...headers},
timeout: TIMEOUT,
transformRequest: requestLogger<B>(url, 'POST'),
transformResponse: responseLogger<T>(url, 'POST'),
})
return rest.post(
url,
body,
).catch((error) => {
defaultNetworkErrorHandler(error);
if (needThrowError) {
throw error;
}
});
};
答案 5 :(得分:0)
let data = qs.stringify(
{
username:this.username,
password:this.password
}
)
axios.post(`${this.$store.state.backendHost}/register`,data,
{
headers:{
'Content-Type': 'application/x-www-form-urlencoded'
}
})
这是我最终得到的代码的最终版本。不使用 qs.stringify()
导致输出如下:
{ '{"username":"shelly","password":"hell"}': '' }
这是不可取的。
另一件事是您可以使用“邮递员”来生成代码
我希望这会有所帮助,我是 stackoverflow 的新手。如有错误请忽略