【问题标题】:Uploading multiple files with nodemailer/sendgrid使用 nodemailer/sendgrid 上传多个文件
【发布时间】:2015-09-21 13:37:29
【问题描述】:

有没有办法使用 Nodemailer/Express/Multer 将多个附件上传到 Sendgrid?我可以发送单个文件,但对附件数组进行彻底测试失败。

这是我提交文件的控制器功能:

    $scope.submitEmail = function(email) {

    var formData = new FormData();

    $scope.email.to = $scope.email_employer;


    formData.append('from', $scope.email.from);
    formData.append('to', $scope.email.to);
    formData.append('subject', $scope.email.subject);
    formData.append('text', $scope.email.text);        

    var fileSelect = document.getElementById('file-select');
    var files = fileSelect.files;
    for (var i = 0; i < files.length; i++) {
      var file = files[i];

      // Add the file to the request.
      formData.append('attachment', file, file.name);
    }

    /*
    Object.keys($scope.email).forEach(function(key) {
        formData.append(key, $scope.email[key]);
    });
    */

    $http.post('/api/email', formData, {
        transformRequest: angular.identity,
        headers: {'Content-Type': undefined}
    }).then(function(data, status) {

        console.log("Sent ok");

    }, function(data, status) {

        //here we have to add an error message e.g. "We could not send the form at this moment. Try again later"
        console.log(data);
    });
};

这是我的 app.js,我尝试将文件发送到 Sendgrid

// Set default node environment to development
process.env.NODE_ENV = process.env.NODE_ENV || 'development';

var express = require('express');
var config = require('./config/environment');
var http = require('http');
var bodyParser = require('body-parser');

var multer = require('multer');
var upload = multer({ dest: './uploads/' });
//var upload = multer();

var nodemailer = require('nodemailer');
var sgTransport = require('nodemailer-sendgrid-transport');

var options = {
  auth: {
    api_user: '##########',
    api_key: '###########'
 }
}

var mailer = nodemailer.createTransport(sgTransport(options));


// Setup server
var app = express();

var server = require('http').createServer(app);
require('./config/express')(app);
require('./routes')(app);


app.post('/api/email', upload.array('attachment', 4), function(req, res, next)     {

console.log(req.file);

var mailOptions = {
    to: req.body.to,
    from: req.body.from,
    subject: req.body.subject,
    text: req.body.text,
    attachments: [
        {
            filename: req.file.originalname,
            path: req.file.path
        }
    ]
};

mailer.sendMail(mailOptions, function(err, res) {
    if (err) { 
        console.log(err);
    }
    console.log(res);
  });
});

// Start server
server.listen(config.port, config.ip, function () {
console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

// Expose app
exports = module.exports = app;

显示以下错误:

TypeError: Cannot read property 'originalname' of undefined
at /Applications/MAMP/htdocs/myproject/server/app.js:51:35
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/myproject/node_modules/express/lib/router/layer.js:82:5)
at next (/Applications/MAMP/htdocs/myproject/node_modules/express/lib/router/route.js:100:13)
at done (/Applications/MAMP/htdocs/myproject/node_modules/multer/lib/make-middleware.js:36:7)
at indicateDone (/Applications/MAMP/htdocs/myproject/node_modules/multer/lib/make-middleware.js:40:51)
at /Applications/MAMP/htdocs/myproject/node_modules/multer/lib/make-middleware.js:142:11
at WriteStream.<anonymous> (/Applications/MAMP/htdocs/myproject/node_modules/multer/storage/disk.js:43:9)
at emitNone (events.js:72:20)
at WriteStream.emit (events.js:166:7)
at finishMaybe (_stream_writable.js:468:14)

【问题讨论】:

  • 将代码粘贴到您使用 upload.array('attachment') 的位置。还要写下测试多个附件时失败的原因。如果控制台有错误,那么也写出来。
  • 我已经更新了我的代码。我希望这很清楚。如果您需要更多信息,请告诉我

标签: node.js express sendgrid multer


【解决方案1】:

感谢您的更新。现在对我来说很清楚了。 您的错误意味着 req.file 未定义。这是正确的。 查看 multer 文档https://github.com/expressjs/multer:

如果您使用upload.single,则文件数据在req.file 中。但是,当您使用 upload.array 时,您的文件数据位于 req.files (文件的复数形式)中。

要解决此问题,请将代码 req.file 更改为 req.files,并记住这是包含文件数据的数组。

例如第一个文件的原始名称在 req.files[0].originalname 中

【讨论】:

  • 谢谢。那行得通!我现在必须找到一种方法来遍历文件数组并将附件放入 Sendgrid 数据中。您对如何实现这一目标有任何想法吗?这就是我到目前为止所拥有的。 var mailOptions = { to: req.body.to, from: req.body.from, subject: req.body.subject, text: req.body.text, attachments: [ { filename: req.files[0].originalname, path: req.files[0].path } ] };
  • 很高兴能帮上忙。我在没有测试的情况下编写了下面的代码(如果有错误,请不要投反对票): var attachementList = []; for(var i = 0 ; i
  • 对您的代码进行一些小的更改。非常感谢! app.post('/api/email', upload.array('attachment', 4), function(req, res, next) {var attachementList = [];for (var i = 0; i &lt; req.files.length; i++) {attachementList.push({filename: req.files[i].originalname,path: req.files[i].path})}var mailOptions = {to: req.body.to,from: req.body.from,subject: req.body.subject,text: req.body.text,attachments: attachementList}mailer.sendMail(mailOptions, function(err, res) {if (err) {console.log(err);}console.log(res);});});
  • :) 如果我的回答让您满意,请检查是否已接受。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2011-09-23
相关资源
最近更新 更多