服务器在POST请求中返回404

时间:2019-11-13 16:03:13

标签: node.js reactjs http-status-code-404 strapi

我有一个使用React和Strapi无头CMS构建的项目(使用nodejs)。使用Strapi处理的后端位于端口443中。当我使用http://site:443向后端中的任何URL发送GET请求时,我会收到有效的响应,但POST请求始终返回错误404。

我使用了外部工具https://reqbin.com/对其进行了测试,并获得了相同的结果。

有趣的是,即使我得到404响应,该路由仍在处理和执行,但仍会返回404响应。

为什么会这样?

预先感谢

这是到达此路线的代码:

 /**
   * Create a/an orders record.
   *
   * @return {Object}
   */

create: async (ctx) => {

let params = ctx.request.body;


if (params.Sum) { // only if we got a good POST response

  // check secret code
  let a = params.UniqueID;
  var res = a.substr(a.length - 12, a.length);
  if (res !== 'secret') {
    ctx.throw(500, 'SECURITY BLOCK', { expose: true });
    return null;
  }
  var username = a.substr(0, a.length - 12);

  // create validity
  var date = new Date();
  if (params.Sum === '250') { // one month membership
    date.setTime( date.getTime() + 31 * 86400000 );
  } else if (params.Sum === '390') { // one month membership
    date.setTime( date.getTime() + 180 * 86400000 );
  }

  // create order in database
  let today = new Date();
  // extract username
  var n = params.CustomerName.indexOf("_");
  var name = params.CustomerName.substr(0, n);
  var instId = params.CustomerName.substr(n+1, params.CustomerName.length);
  const order = await strapi.services.orders.add({
    userId: username, 
    username: name,
    institutionId: instId,
    sum: params.Sum,
    transactionDate: today,
    validity: date,
    cardNum: params.CardNum,
    cardName:params.CardName,
  });

    let axiosArr = {
        institutions: [{_id: instId}],
        validity: date,
        secret: 'secret'
    }
    axios.put(apiUrl+'/users/'+username, axiosArr).then(() => {return order})

  // return order

大多数代码与问题无关,我在想,也许响应是404的原因是因为我不是立即返回订单对象,而是仅在axios.put之后返回? 不幸的是我现在无法测试

2 个答案:

答案 0 :(得分:1)

我对stradi并不熟悉,但听起来不像是身份验证问题。您确定这些路由设置为接受POST请求而不仅仅是GET请求吗?如果用户缺少访问资源所需的权限,通常会返回404,以不让用户知道资源的存在,但是没有任何示例代码,我无法确切地说出您的情况。您可以链接更多代码吗?

答案 1 :(得分:1)

如果路由执行得当,但返回了404,则是因为响应主体为空。

在您的代码中,您评论了return order

在代码中添加诸如ctx.send({order})之类的内容,或取消对您的return的注释

您将不再具有 404