encodeUri无法与res.json express一起使用

时间:2018-08-22 15:40:29

标签: javascript json node.js express

有一个快递应用程序,它将经过清理的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一起使用并替换?

1 个答案:

答案 0 :(得分:0)

问题更新后更新。

在JavaScript中,您可以使用一些函数来完成类似的转换:encodeURIencodeURIComponent,以及它们的对应函数decodeURIdecodeURIComponentencodeURI用于安全地编码完整的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!'));

postman screencapture