很简单Node.jsPOST表格查询

Very simple Node.js POST form inquiries

我有一个简单的 node.js 应用程序,它使用 express static 和带有 POST 表单的 nodemailer,将填写的字段通过电子邮件发送给我自己。我的问题非常简单,我对 Node 还很陌生,所以我找不到解决这些问题的方法。

我的第一个问题是我找不到将所有表单数据放入电子邮件文本中的方法。下面,我试图将我的表单数据存储在 JSON 中并在电子邮件文本中调用它,但它不起作用。只有当我只对文本使用一个变量(例如 req.body.name)时,它才对我有效。如何在电子邮件中一起格式化我的数据?

我的第二个问题是,我可以找到一种方法来处理发送电子邮件后的应用程序。我希望它重定向到成功页面,如标记行所示,但它不起作用。相反,该页面转到 /reqform 并显示一条错误消息,指出 success.html 不存在(它与我的 html 文件位于同一 public 文件夹中)。我认为问题出在我的 sendFile 用法上,但我不确定。

app.post('/reqform', urlencodedParser, function (req, res) {
    response = {
        name: req.body.name,
        email: req.body.email,
        phone: req.body.phone
    };
    var mailContent = {
        from: 'myemail@gmail.com',
        to: 'myemail@gmail.com',
        subject: 'Service Request From req.body.name',
        text: response               //*** Problem #1
    };
    transporter.sendMail(mailClient, function (error, info) {
        if (error) {
            console.log(error);
        } else {
            res.sendFile("success.html");   //** Problem #2
        }
    });
})

非常感谢任何帮助。谢谢!

  1. JavaScript 对象 is just "[object Object]" 的默认字符串值。如果您想要其他任何东西,则必须具体说明您希望它如何表示。

    例如,JSON 是一种 text/string 格式,表示像对象这样的值。它与对象本身是分开的,因此您需要转换才能使用它:

    var mailContent = {
        // ...
        text: JSON.stringify(response)
    }
    

    或者,提供您自己的格式:

    var mailContent = {
        // ...
        text: `Name: ${response.name}\nEmail: ${response.email}\nPhone: ${response.phone}`
    }
    
  2. 在这种情况下使用 res.redirect() 可能更好,允许 client/browser 通过应用程序的 static() 中间件请求 success.html

    res.redirect('/success.html');
    

    res.sendFile() 不与任何 static() 中间件协作以了解您的 public 文件夹。它希望您直接或使用其 root 选项提供完整路径:

    res.sendFile(path.join(__dirname, 'public/success.html'));