【问题标题】:Sending data with vanilla JS ajax and reading it with Node api使用 vanilla JS ajax 发送数据并使用 Node api 读取数据
【发布时间】:2018-08-27 13:49:15
【问题描述】:

我的客户端有这段代码:

sendMail(e) {
    e.preventDefault();
    var name = document.getElementById('name').value;
    var contactReason = document.getElementById('contactReason').value;
    var email = document.getElementById('email').value;
    var additionalInfo = document.getElementById('additionalInfo').value;
    var body = {
        name: name,
        contactReason: contactReason,
        email: email,
        additionalInfo: additionalInfo,
    };
    console.log(body);
    fetch('http://localhost:4000/', {
        method: 'POST',
        body: body.toString(),
    }).then(r => console.log(r)).catch(e => console.log(e));
}

而且这种作品。它将对象记录到控制台,并将某些内容发送到后端。

这是我的节点调用:

var express = require('express');
var router = express.Router();
var cors = require('cors');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({extended: true}));
app.use(cors());
app.options('*', cors());

var a = '=';
router.post('/', (req, res, next) => {
        console.log('mailing');
        console.log(a);
        console.log(req.body);
        a += '=';
        var nodemailer = require('nodemailer');

        var transporter = nodemailer.createTransport({
            host: "smtp.gmail.com", // hostname
            auth: {
                user: '******',
                pass: '******'
            }
        });

        let mailOptions = {
            from: `${req.body.name} ${req.body.email}`, // sender address
            to: 'alexander.ironside@mygeorgian.ca', // list of receivers
            subject: 'Email from UczSieApp contact form', // Subject line
            text: 'Hello world ', // plaintext body
            html: `
                        <h4>Imie: ${req.body.name}</h4>
                        <h4>Email: ${req.body.email}</h4>
                        <h4>Powod kontaktu: ${req.body.contactReason}</h4>
                        <p>Wiadomosc: ${req.body.additionalInfo}</p>
                        `
        };

        // send mail with defined transport object
        transporter.sendMail(mailOptions, function (error, info) {
            if (error) {
                return console.log(error);
            }

            console.log('Message sent: ' + info.response);
        });
    }
);
module.exports = router;

那么代码现在做了什么:

正在创建对象,正在向 Node 后端发送一些东西(不确定究竟是什么),并且正在发送一封电子邮件。但是req.body 被记录为{}

我想做什么:

将发送到后端的值读取为body,并发送包含此数据的电子邮件。

我错过了什么?

【问题讨论】:

  • 在你的客户中你想做JSON.stringify(body),因为.toString()会导致'[object Object]'

标签: javascript node.js ajax express


【解决方案1】:

我使用 GET 而不是 POST,这解决了我的问题。这有点像作弊,但确实有效。

【讨论】:

    【解决方案2】:

    应该添加到 fetch

                headers: {
                  'Accept': 'application/json',
                  'Content-Type': 'application/json'
                },
    
                body: JSON.stringify(body),
    

    所有正确的代码

    前端

    sendMail(e) {
        e.preventDefault();
        var name = document.getElementById('name').value;
        var contactReason = document.getElementById('contactReason').value;
        var email = document.getElementById('email').value;
        var additionalInfo = document.getElementById('additionalInfo').value;
        var body = {
            name: name,
            contactReason: contactReason,
            email: email,
            additionalInfo: additionalInfo,
        };
        console.log(body);
        fetch('http://localhost:4000/', {
            headers: {
              'Accept': 'application/json',
              'Content-Type': 'application/json'
            },
    
            body: JSON.stringify(body),
            method: 'POST',
        }).then(r => console.log(r)).catch(e => console.log(e));
    }
    

    后台

    var express = require('express');
    var router = express.Router();
    var cors = require('cors');
    var app = express();
    var bodyParser = require('body-parser');
    app.use(bodyParser.json()); // for parsing application/json
    app.use(bodyParser.urlencoded({extended: true}));
    app.use(cors());
    app.options('*', cors());
    
    var a = '=';
    router.post('/', (req, res, next) => {
            console.log('mailing');
            console.log(a);
            console.log(req.body);
            a += '=';
            var nodemailer = require('nodemailer');
    
            var transporter = nodemailer.createTransport({
                host: "smtp.gmail.com", // hostname
                auth: {
                    user: '******',
                    pass: '******'
                }
            });
    
            let mailOptions = {
                from: `${req.body.name} ${req.body.email}`, // sender address
                to: 'alexander.ironside@mygeorgian.ca', // list of receivers
                subject: 'Email from UczSieApp contact form', // Subject line
                text: 'Hello world ', // plaintext body
                html: `
                            <h4>Imie: ${req.body.name}</h4>
                            <h4>Email: ${req.body.email}</h4>
                            <h4>Powod kontaktu: ${req.body.contactReason}</h4>
                            <p>Wiadomosc: ${req.body.additionalInfo}</p>
                            `
            };
    
            // send mail with defined transport object
            transporter.sendMail(mailOptions, function (error, info) {
                if (error) {
                    return console.log(error);
                }
    
                console.log('Message sent: ' + info.response);
            });
        }
    );
    module.exports = router;
    

    【讨论】:

    • 这可能是正确的,但最好澄清什么是错的和发生了什么变化。
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2023-03-22
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多