我有一个使用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之后返回? 不幸的是我现在无法测试
答案 0 :(得分:1)
我对stradi并不熟悉,但听起来不像是身份验证问题。您确定这些路由设置为接受POST请求而不仅仅是GET请求吗?如果用户缺少访问资源所需的权限,通常会返回404,以不让用户知道资源的存在,但是没有任何示例代码,我无法确切地说出您的情况。您可以链接更多代码吗?
答案 1 :(得分:1)
如果路由执行得当,但返回了404,则是因为响应主体为空。
在您的代码中,您评论了return order
。
在代码中添加诸如ctx.send({order})
之类的内容,或取消对您的return
的注释
您将不再具有 404 。