我试图在不使用jQuery的情况下解决这个问题,这样我就可以更好地理解它是如何工作的。
我正在向一个带有JSON对象的节点服务器发送一个AJAX请求。服务器可以接收请求并进行响应,但请求正文始终为空。我已经尝试将请求标头设置为' application / json'但由于某种原因,这会将表单提交更改为POST参数到URL,而不是使用Javascript函数。如果有人能告诉我为什么会这样,那将非常感激。
表格
<form onsubmit="sendEmail(); return false;">
<input type="text" name="fromEmail">
<input type="text" name="subject">
<textarea name="message" rows="14"></textarea>
<input type="submit" value="SEND">
</form>
电子邮件功能
function sendEmail() {
var emailContent = JSON.stringify(
{
email: $('input[name=fromEmail]').val(),
subject: $('input[name=subject]').val(),
message: $('textarea[name=message]').val()
}
);
var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+ ...
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE 6 and older
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
httpRequest.open('POST','/message', true);
httpRequest.onreadystatechange = function() {
if (httpRequest.readyState == 4 && httpRequest.status == 200) {
alert(httpRequest.responseText);
}
}
httpRequest.send(emailContent);
}
节点JS路由
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
// set body parser
app.use(bodyParser.json());
// Process email form
app.post('/message', function(req,res) {
console.log('Request received by email path.');
console.log(req.body);
res.send('{"success": true}')
console.log('Response sent.')
});
答案 0 :(得分:1)
如果您尝试发送json响应,则需要将响应的内容类型设置为json。
res.setHeader('Content-Type', 'application/json');
答案 1 :(得分:1)
你可以试试这个:
httpRequest.open('POST','/message', true);
httpRequest.setRequestHeader("Content-Type","application/json");
httpRequest.send(emailContent);
参考: http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp
答案 2 :(得分:1)
我想我理解你的问题,你需要的是调用函数sendEmail()而不进行回发。那么,为此您将需要一个常规的html按钮而不是表单提交。表单用于执行对特定URL的服务器请求并生成另一个回发。
您有两种选择:
1)使用按钮和ajax请求(XMLHttpRequest)进行客户端调用:
<input type="text" name="fromEmail">
<input type="text" name="subject">
<textarea name="message" rows="14"></textarea>
<input type="submit" value="SEND">
<button type="button" onclick="sendEmail()">Send</button>
2)使用表单提交并直接从表单中调用服务。参数将从表格中获取,并将在请求中发送:
<form action="/message" method="post">
<input type="text" name="fromEmail">
<input type="text" name="subject">
<textarea name="message" rows="14"></textarea>
<input type="submit" value="SEND">
</form>
然后在服务器端,您可以使用您为字段指定的名称访问数据:
fromEmail = req["fromEmail"]