Node.js 快速处理错误:无法解码参数
我有一个将http重定向到https的简单脚本。这可以正常工作,除非存在格式错误的url,例如:website.com/%c0%ae%c0%ae。它显示如下内容:Node.js 快速处理错误:无法解码参数,node.js,express,Node.js,Express,我有一个将http重定向到https的简单脚本。这可以正常工作,除非存在格式错误的url,例如:website.com/%c0%ae%c0%ae。它显示如下内容: var express = require('express'); var app = express(); app.get('*', function (req, res) { var host = req.get('Host'); return res.redirect(['https://', host, re
var express = require('express');
var app = express();
app.get('*', function (req, res) {
var host = req.get('Host');
return res.redirect(['https://', host, req.url].join(''));
});
var server = app.listen(8080, function () {
console.log('starting');
});
URIError:无法解码参数'/%c0%ae%c0%ae'
at组件(本机)
在decode_参数(/…/node_modules/express/lib/router/layer.js:167:12)处
在Layer.match(/…/node_modules/express/lib/router/Layer.js:143:15)
在matchLayer(/…/node_modules/express/lib/router/index.js:557:18)
下一步(/…/node_modules/express/lib/router/index.js:216:15)
在expressInit(/…/node_modules/express/lib/middleware/init.js:33:5)
在Layer.handle[作为handle_请求](/…/node_modules/express/lib/router/Layer.js:95:5)
在trim_前缀处(/…/node_modules/express/lib/router/index.js:312:13)
at/../node_modules/express/lib/router/index.js:280:7
位于Function.process_参数(/…/node_modules/express/lib/router/index.js:330:12)
当用户可以随机看到我的项目文件在服务器中的位置时,这是不好的。有没有办法处理此错误?可能的解决方法:
URIError: Failed to decode param '/%c0%ae%c0%ae'
at decodeURIComponent (native)
at decode_param (/...<PROJECT DIRECTORY>.../node_modules/express/lib/router/layer.js:167:12)
at Layer.match (/.../node_modules/express/lib/router/layer.js:143:15)
at matchLayer (/.../node_modules/express/lib/router/index.js:557:18)
at next (/.../node_modules/express/lib/router/index.js:216:15)
at expressInit (/.../node_modules/express/lib/middleware/init.js:33:5)
at Layer.handle [as handle_request] (/.../node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/.../node_modules/express/lib/router/index.js:312:13)
at /.../node_modules/express/lib/router/index.js:280:7
at Function.process_params (/.../node_modules/express/lib/router/index.js:330:12)
谢谢@Oleg的提示。但不知何故,你的解决方案并没有为我记录错误。以下是我的想法:
var express = require('express');
var app = express();
app.get('*', function (req, res) {
// redirect regular paths
var host = req.get('Host');
return res.redirect(['https://', host, req.url].join(''));
});
// your express error handler
app.use(function(err, req, res, next) {
// in case of specific URIError
if (err instanceof URIError) {
err.message = 'Failed to decode param: ' + req.url;
err.status = err.statusCode = 400;
// .. your redirect here if still needed
return res.redirect(['https://', req.get('Host'), req.url].join(''));
} else {
// ..
}
// ..
});
var server = app.listen(8080, function () {
console.log('starting');
});
编辑:
代码段应作为最后一个路由放置,它检查是否存在其他路由跳过的错误(显然存在),并发送默认响应。当您将%添加为API端点的最后一个字符时,会发生此错误。返回res.redirect('https://'+主机+req.url);尝试this@pewpewlasers为了让它发挥作用,你必须把它放在你的路线之后
var express = require('express');
var app = express();
app.use(function(req, res, next) {
var err = null;
try {
decodeURIComponent(req.path)
}
catch(e) {
err = e;
}
if (err){
console.log(err, req.url);
return res.redirect(['https://', req.get('Host'), '/404'].join(''));
}
next();
});
app.get('*', function (req, res) {
return res.redirect(['https://', req.get('Host'), req.url].join(''));
});
var server = app.listen(8080, function () {
console.log('Starting');
});
var express = require('express');
var app = express();
// handles 400 error
app.use((err, req, res, next) => {
if (!err) return next();
return res.status(400).json({
status: 400,
error: 'OOps! Bad request',
});
});