Axios发布空请求

时间:2018-07-02 21:06:04

标签: node.js axios

我试图向后端发送一个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);

6 个答案:

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

More informations

答案 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"}': '' } 这是不可取的。 另一件事是您可以使用“邮递员”来生成代码enter image description here

我希望这会有所帮助,我是 stackoverflow 的新手。如有错误请忽略