我正在使用 mandrill 和 Node.js 创建一个邮件客户端...我的节点服务器在提交邮件客户端表单时收到一个空的 POST 请求正文

Posted

技术标签:

【中文标题】我正在使用 mandrill 和 Node.js 创建一个邮件客户端...我的节点服务器在提交邮件客户端表单时收到一个空的 POST 请求正文【英文标题】:I am creating a mail client with mandrill & Node.js... My node server is getting an empty POST request body on submit of the mail client form 【发布时间】:2015-06-09 06:29:18 【问题描述】:

//节点js的服务器端代码

//Dependencies
var express = require('express');
var http = require('http');
var bodyParser = require('body-parser');
var path = require('path');
var fs = require('fs');
var multer = require('multer');
var mongo = require('mongoose');
var schema =require('./schema.js');
var done = false;
var cors = require('cors');
var mandrill = require('mandrill-api/mandrill');
//END OF EXTERNAL DEPENDENCIES`
var mandrill_client = new mandrill.Mandrill('Some_Mandrill_API_Tocken');
//Environment Settings For Express Js Server
var app = express();
// all environments
app.set('port', process.env.PORT || 8080);
app.set('views', path.join(__dirname, 'inner_html'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cors());
app.use(bodyParser.json());       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded(// to support URL-encoded bodies
    extended: true
));

app.post( '/sendemail', function(req, res)
console.log(req.body);
var _name = 'Anonymous User';
var _email = req.email;
var _subject = 'Query';
var _messsage = req.message;
//implement your spam protection or checks.
var message = 
"text": _messsage,
"subject": "Website Query",
"from_email": _email,
"from_name": _name,
"to": [
"email": "agniruddra.r@gmail.com",
"name": "Admin"
],
"important": false,
"track_opens": true,
"track_clicks": true,
"auto_text": true
;


mandrill_client.messages.send("message": message, function(result) 
console.log(message);
console.log(result);
res.json('msg' : 'Your Mail sent to Faculty Successfully');
, function(e) 
// Mandrill returns the error as an object with name and message keys
console.log('A mandrill error occurred: ' + e.name + ' - ' + e.message);
// A mandrill error occurred: Unknown_Subaccount - No subaccount exists with the id 'customer-123'
);
);

下面是我的html表单主体.....

<div id="myModal" class="modal fade">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h4 class="modal-title">Email Faculty</h4>
            </div>
            <form class="rqust_mail" method="POST" action="/sendemail">
            <div class="modal-body">
                    <div class="form-group">
                        <label for="recipient-name" class="control-label">Email:</label>
                        <input type="text" class="form-control" id="email" name="email">
                    </div>
                    <div class="form-group">
                        <label for="message-text" class="control-label">Message:</label>
                        <textarea class="form-control" id="message" name="message"></textarea>
                    </div>                    
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                <input type="submit" class="btn btn-primary send_mail" name="Send" value="Send"/>
            </div>
            </form>

            <script type="text/javascript">
                /*$('.send_mail').click(function()                        
                    $.ajax(
                    type: "POST",
                    data: data,
                    contentType: "application/json",
                    dataType:"json",
                    url: "https://mywebsite.com/sendemail",                 
                    success:function(data)
                            console.log(JSON.stringify(data));
                            //$('.rqust_mail input').reset();
                            
                    );
                );*/
            </script>
        </div>
    </div>
</div>

我尝试了 ajax 和普通的 html http post 请求。这两个(HTML 和 AJAX POST)请求正文都包含一个空的 json。

请建议我的代码有什么问题。

提前致谢。

【问题讨论】:

【参考方案1】:

我在浏览器脚本中看不到它实际将表单数据收集到data 的任何地方。

无论如何,请尝试将 multer https://www.npmjs.com/package/multer 与常规 POST(不是 AJAX)一起使用。

var express = require('express')
var multer  = require('multer')

var app = express()
app.use(multer( dest: './uploads/'))

然后您可以在您的帖子处理程序中查看req.body

【讨论】:

感谢您的回复......我已经为文件上传配置了 multer。我在这里只发布了我的 node.js 服务器代码的一部分。即使使用 multer 作为中间件,也会出现同样的错误。但是 Ajax 部分可能有问题。我是阿贾克斯的新手。但是我认为正常的 HTTP POST 请求应该可以工作,而这在我的情况下没有发生。能说明原因吗??? 没有实际代码很难猜到。也许一些 app.use 在身体解析器干扰之前。我会取出任何你不需要的 app.use 并开始修剪你的代码,直到它工作为止。排除法。或者,从一个例子开始,让它工作,然后逐渐添加你的真实代码。使用您尝试演示问题的真实代码发布一个最小示例。 我还注意到你在post 处理程序中写的req.email 你的意思是req.body.email【参考方案2】:

使用req.body.email 代替req.email。并使用app.use(express.bodyParser())

【讨论】:

【参考方案3】:

我认为解析器存在一些编码异常......我刚刚删除了contentType: "application/json", and the code is working fine..... still dont know the reason why it is not working with normal HTTP POST....it may be the same encoding exception.....

【讨论】:

以上是关于我正在使用 mandrill 和 Node.js 创建一个邮件客户端...我的节点服务器在提交邮件客户端表单时收到一个空的 POST 请求正文的主要内容,如果未能解决你的问题,请参考以下文章

使用车把和 Mandrill-dotnet -library 在 mandrill 中的每个循环

mandrill 和嵌套的合并变量

如何使用 Parse 和 Mandrill 发送电子邮件通知?

使用 PHPMailer 和 Mandrill 发送模板

使用 Mandrill 和 Laravel 发送预定的电子邮件

Rails 4、Devise 和 Mandrill 电子邮件