在Node.js上检索联系表单数据的最佳方法?

时间:2014-10-05 16:05:37

标签: regex node.js escaping contact-form

我尝试设置一个Node.js服务器来监听联系表单request URL,然后从联系人data中检索相关的form。< / p>

client基本上会发出一个看起来像这样的请求:

HTML:

<form>
   <input type="text" class="typed" placeholder="name" name="name">
   <input type="text" class="typed" placeholder="email" name="email">
   <input type="text" class="typed" placeholder="subject" name="subject">
   <textarea class="typed" placeholder="your enquiry.." name="enquiry"></textarea>
   <input type="submit" value="submit">
</form>

JS:

$('form').submit(function () 
{
   var name = $.trim($(this).find('[name="name"]').val());
   var email = $.trim($(this).find('[name="email"]').val());
   var subject = $.trim($(this).find('[name="subject"]').val());
   var enquiry = $.trim($(this).find('textarea').val());

   $.ajax({
    url: "/contactform",
    type:'POST',
    data: {
        name : name,
        email: email,
        subject: subject,
        enquiry: enquiry
    }
   });
});

浏览器会转义必要的符号并用&#34; +&#34;替换空格。并最终发送出这样的东西:

/contactform?name=some+name&email=someemail%40address.com&subject=some+email+subject&enquiry=some+enquiry

服务器将收到上述请求,它将转义它,然后使用Regex尝试检索它包含的相关数据,如下所示:

var httpServer = http.createServer(function (request, response)
{
   // escaping it doesn't actually replace the "+" does it ? Any solutions ?
   var requestURL = unescape(request.url);

   var name = requestURL.match(/name=([^&email=]*)/)[1]; // returns * so * which is wrong
   var email = requestURL.match(/email=([^&subject=]*)/)[1]; // returns an empty string which is wrong
   var subject = requestURL.match(/subject=([^&enquiry=]*)/)[1]; // returns * som * which is wrong
   var enquiry = requestURL.match(/enquiry=(.*)/)[1]; // returns * some+enquiry * which is correct
}).listen(8080);

正如您在评论中看到的那样,我的正则表达式无法正常工作。您可以在浏览器的控制台上自行尝试。我做错了什么?

此外,正如我刚才所说,从客户端到服务器发送联系表单数据有更好的格式吗?或者?xxx=xxx+xxx+xxx&xxxx=xxxx+xx+xxx&....etc格式是最好的格式,因为它似乎是标准格式?浏览器强制执行上述格式,但我可以使用JS强制使用不同的格式吗?

我只是认为如果用户遇到例如上述情况,上述情况就不会奏效。在他们输入的文本中的某处使用&amp; subject = 。这种情况极不可能,但仍然有点烦人的是,在服务器上检索表单数据的方式并非100%可靠。或者有一个吗?

上述客户端/服务器端代码显然不完整。我省略了不相关的内容,使其更具可读性。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

为什么不使用内置的url模块来解析网址?它执行所有的unescaping和一切为您。例如:

var url = require('url');

// ...

var httpServer = http.createServer(function (request, response)
{
  var info = url.parse(request.url, true);
  console.dir(info);
}).listen(8080);

答案 1 :(得分:0)

您需要将以下字符串放入正向前瞻,而不是字符类。

var name = requestURL.match(/name=(.*?)(?=&email=)/)[1]; 
var email = requestURL.match(/email=(.*?)(?=&subject=)/)[1];
var subject = requestURL.match(/subject=(.*?)(?=&enquiry=)/)[1];

示例:

> requestURL.match(/name=(.*?)(?=&email=)/)[1];
'some+name'
> requestURL.match(/email=(.*?)(?=&subject=)/)[1];
'someemail%40address.com'
> requestURL.match(/subject=(.*?)(?=&enquiry=)/)[1];
'some+email+subject'