javascript – Node.JS在询问实际存在的端点时返回404
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – Node.JS在询问实际存在的端点时返回404,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4117字,纯文字阅读大概需要6分钟。
内容图文
![javascript – Node.JS在询问实际存在的端点时返回404](/upload/InfoBanner/zyjiaocheng/782/291f80b66acf4c8085f9878b822e7155.jpg)
我有一个Web应用程序,由以前的公司创建,用Angular.JS编写.该应用程序向后端(以Node.JS Express编写)公开请求,以收集填充表所需的一些数据.具体来说,这是每次用户在保存表的页面中输入时应用程序发送的请求(config变量保存访问令牌).
return $http.get(API + '/api/myPath/for/Having/Data', config).then(handleSuccess, handleError);
handleSuccess和handleError是这样定义的
handleSuccess: function (res) {
debugger;
var deferred = $q.defer();
res.data.success ? deferred.resolve(res.data) : deferred.reject(res.data.message);
return deferred.promise;
},
handleError: function (error) {
return {
success: false,
message: error
};
}
在我的后端,我已经用一个“/ api”前缀调用了一个监听器,就像这样
app.use('/api', authorization.validateToken);
另一个监听器,只有在没有匹配时才能工作(写在文件的最末端,处理应用程序的所有常规查询)
app.all('*', (req, res) => {
console.log('Hi, Stack Overflow!');
res.send({
success: false,
status: 404,
message: 'Invalid Uri Resource'
});
});
最后,这是应该从Angular.js后端调用的端点
app.get('/api/myPath/for/Having/Data', something.somethingToCall);
这是有趣的部分:由于我仍然必须理解的原因,Angular.JS调用该端点两次,导致一个失败的过程(404)和另一个顺利过程(200).
操作流程应如下所示:Angular调用后端 – >节点检查令牌的有效性 – >如果一切顺利,就执行操作.
该操作被调用两次(由于Visual Studio Code调试器和Chrome的网络监视器而看到),即使令牌的验证过程每次都正确执行,next()函数第一次将持有app.all()监听器.
此外,甚至在我开始调试发出的第一个请求之前,Google Chrome上的JavaScript控制台警告我发生了一个错误,例如“无法读取未定义的属性数据”,这意味着请求被执行了两次第一次返回404.
exports.validateToken = (req, res, next) => {
console.log(`check user here`);
// next();
var token = //I take the token
console.log(token);
if (token) {
jwt.verify(token, require('../../secret'), (err, decoded) => {
if (err) {
res.send({
success: false,
status: 500,
tokenExpired: true,
message: "Effettua nuovamente l'accesso"
});
} else {
req.decoded = decoded;
next();
}
});
} else {
res.send({
success: false,
status: 406, // Fprbidden
message: 'User not Authenticated'
});
}
};
有人知道如何以某种方式帮助我吗?
编辑:这是Chrome看到这两个请求的示例.特别是,屏幕截图是指第一个被调用并生成404的屏幕截图
CORS在这样的后端处理
app.use(function (req, res, next) {
if (req.headers.origin && (req.headers.origin.match("http:\/\/somewebsite.com.*") || req.headers.origin.match("http:\/\/localhost:8010") )) {
res.header("Access-Control-Allow-Origin", req.headers.origin);
}
next();
});
另外,我正在添加需要调用的端点.这也利用MongoDB Mongoose查询DataBase并将内容返回给前端.我传递的参数是pageSize(每页有多少元素)和当前页码
exports.getAds = (req, res) => {
var criteria = req.body || {};
var pageSize = criteria['pageSize'] ? Number(criteria['pageSize']) : undefined;
var pageNumber = criteria['pageNumber'] ? Number(criteria['pageNumber']) : undefined;
var sort = criteria.sort || { createdAt: 'desc' };
if (criteria.customerName) criteria.customerName = { $regex: `.*${criteria.customerName}.*`, $options: 'i' };
if (criteria.spentEuros) criteria.spentEuros.$gte = criteria.spentEuros;
if (criteria.referralMail) criteria.referralMail = { $regex: `.*${criteria.referralMail}.*`, $options: 'i' };
console.log(criteria);
var columns = "customerName duration spentEuros";
if (pageSize && pageNumber) {
Adv.paginate(criteria, {
page: pageNumber,
limit: pageSize,
select: columns,
sort: sort
}, function (err, result) {
if (!err) res.status(200).send({ success: true, data: result });
else res.status(500).send({ success: false, message: err });
});
} else {
Adv.find(criteria)
.select(columns)
.sort(sort)
.exec(function (err, result) {
if (!err) res.status(200).send({ success: true, data: result });
else res.status(500).send({ success: false, message: err });
});
}
};
EDIT2:问题的解决方案:在后端添加app.options侦听器(正如@slebetman所指出的),以及已经存在的app.get,解决了问题
解决方法:
Here’s the funny part: for a reason that I still have to understand, Angular.JS calls that endpoint twice…
这听起来很像浏览器发送CORS预检OPTIONS请求,然后是GET.检查正在使用的HTTP谓词,如果需要在端点上支持CORS,请确保您正在处理OPTIONS(而不仅仅是GET). (如果您不希望这是一个跨源请求,请检查相对于API调用源的页面的来源,[协议,端口,域]似乎是不同的 – 如果它是OPTIONS调用. )
内容总结
以上是互联网集市为您收集整理的javascript – Node.JS在询问实际存在的端点时返回404全部内容,希望文章能够帮你解决javascript – Node.JS在询问实际存在的端点时返回404所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。