有一个快递应用程序,它将经过清理的URL保存到mongodb数据库中,我想使用encodeURI()在res.json中呈现解码后的URL,但它无法按预期工作,仅返回编码后的版本。如果我做一个res.send(decodeURI(url))它工作。如何获取res.json以发送解码后的网址。
// Create a url object with escaped and trimmed data.
var Url = new UrlModel(
{ url: req.body.url }
);
if (!errors.isEmpty()) {
// There are errors. Render the form again with error messages.
res.render('index', { errors: errors.array()});
return;
}
else {
// Data from form is valid.
// Check if Url with same name already exists.
UrlModel.findOne({ 'url': req.body.url })
.exec( function(err, found_url) {
if (err) { return next(err); }
if (found_url) {
// Url exists, redirect to its detail page.
res.json({"original_url": decodeURI(found_url.url) });
//res.send(decodeURI(found_url.url))
}
更新:
我的问题可能不清楚。我的输入来自mongodb,其URL格式为
https://www.facebook.com
所以我想转换它的html实体,我不认为encodeUri可以做到这一点。 这段代码中我的输出
res.json({original_url:found_url.url, decoded: decodeURI(found_url.url) });
是{"original_url":"https://www.facebook.com","decoded":"https://www.facebook.com"}
因此url中的//
不会被转换为//。是否有一些核心javascript函数可以执行此操作,或者我必须将函数与regx一起使用并替换?
答案 0 :(得分:0)
问题更新后更新。
在JavaScript中,您可以使用一些函数来完成类似的转换:encodeURI
和encodeURIComponent
,以及它们的对应函数decodeURI
和decodeURIComponent
。 encodeURI
用于安全地编码完整的URL,因为它不会编码协议,主机名或路径。 encodeURIComponent
将对所有内容进行编码。
在编辑过的问题中显示的内容与JavaScript无关(据我所知)。您需要先让后端对字符串进行消毒处理,然后再将其发送回给您。
如果不能选择更新后端,则可以尝试如下操作:
unescape('https://www.facebook.com'.replace(/&#x/g, '%').replace(/;/g, ''))
这会将这些实体解码为它们的实际字符,但是它marked as deprecated不应是永久解决方案。
原始回复。
encodeURI和解码URI完全没有问题。您是否完全确定未按预期退货?中间是否有其他可能再次对其进行编码?
我用邮递员测试了这个小片段。
const express = require('express');
const app = express();
const encoded = encodeURI('http://example.com?query=ÅÍÎÏ˝ÓÔÒÚÆ☃');
const decoded = decodeURI(encoded);
app.get('/json', (req, res) => res.json({ encoded, decoded }));
app.listen(3000, () => console.log('Example app listening on port 3000!'));