node.js - 节点控制器功能中未定义的对象值
问题描述
我创建了一个带有 Angular 7 的联系表单并将其与 nodemailer 集成,以便在提交表单时,应将表单的详细信息提交到指定的电子邮件。该视图工作正常并且完美地传递了值,但是当这些值被发送到节点后端时,它是未定义的,因此电子邮件即将到来,但值被写入为未定义。请看下面的代码:
节点控制器功能:
app.post('http://localhost:4000/api/v1/blogs'+'/send/mail', (req, res) => {
let user = {
name: req.body.name,email: req.body.email,phone: req.body.phone,message: req.body.message}
console.log(user.name) //values in this user object is coming undefined
console.log(req.body)
//nodemailer setup
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'example@gmail.com',
pass: 'password'
}
});
var mailOptions = {
from: 'example@gmail.com',
to: 'example@gmail.com',
subject: 'A new lead has Arrived!',
html: `<p>Name: ${user.name}</p>
<p>Email: ${user.email}</p>
<p>Phone: ${user.phone}</p>
<p>Message: ${user.message}</p>`
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
});
角 .ts 文件:
export class ContactComponent implements OnInit {
contactForm: FormGroup;
public formName: string;
public formEmail: string;
public formPhone: number;
public formMessage: string;
constructor(private router: Router, private blogpostService: BlogpostService,
private formBuilder: FormBuilder, private toastr: ToastrManager) { }
ngOnInit() {
this.contactForm = this.formBuilder.group({
formName: ['', Validators.required],formEmail: ['', Validators.required],formPhone: ['', Validators.required],formMessage: ['']})}
public contact() {
const formData = new FormData();
formData.append('name', this.contactForm.get('formName').value);
formData.append('email', this.contactForm.get('formEmail').value);
formData.append('phone', this.contactForm.get('formPhone').value);
formData.append('message', this.contactForm.get('formMessage').value);
this.blogpostService.contactForm(formData).subscribe(
data => {console.log(data)
this.toastr.successToastr('Your contact information is saved Susseccfully!', 'Success!');
setTimeout(() =>{
this.router.navigate(['/']);
}, 1000)
},
error => {
console.log(error);
console.log(error.errorMessage);
this.toastr.errorToastr('This is not good!', 'Oops!');
this.router.navigate(['/']);
})}}
服务 .ts 文件:
public contactForm(formData): Observable<any> {
let myResponse = this._http.post(this.baseUrl + '/send/mail', formData);
// console.log(formData.get('name'))
return myResponse;
}
更新index.js:
const express = require('express')
const http = require('http')
const appConfig = require('./config/appConfig')
const fs = require('fs')
const mongoose = require('mongoose')
const cookieParser = require('cookie-parser')
const bodyParser = require('body-parser')
const globalErrorMiddleware = require ('./app/middlewares/appErrorHandler');
const routeLoggerMiddleware = require('./app/middlewares/routeLogger');
const logger = require('./app/libs/loggerLib');
//declaring an instance or creating an application instance
const app = express()
//middlewares
app.use(bodyParser.json()) //bodyParser
app.use(bodyParser.urlencoded({ extended: false }))
app.use(cookieParser())
app.use('/uploads', express.static('uploads'))
app.use(globalErrorMiddleware.globalErrorHandler);
app.use(routeLoggerMiddleware.logIp);
// Bootstrap models
let modelsPath = './app/models'
fs.readdirSync(modelsPath).forEach(function (file) {
if (~file.indexOf('.js')) {
console.log(file)
require(modelsPath + '/' + file)
}
})
// end Bootstrap models
// Bootstrap route
let routesPath = './app/routes'
fs.readdirSync(routesPath).forEach(function (file) {
if (~file.indexOf('.js')) {
console.log("including the following file");
console.log(routesPath + '/' + file)
let route = require(routesPath + '/' + file);
route.setRouter(app);
}
});// end bootstrap route
app.use(globalErrorMiddleware.globalNotFoundHandler);
//listening the server - creating a local server
const server = http.createServer(app)
// start listening to http server
console.log(appConfig)
server.listen(appConfig.port)
server.on('error', onError)
server.on('listening', onListening)
function onError(error) {
if (error.syscall !== 'listen') {
logger.error(error.code + ' not equal listen', 'serverOnErrorHandler', 10)
throw error
}
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
logger.error(error.code + ':elavated privileges required', 'serverOnErrorHandler', 10)
process.exit(1)
break
case 'EADDRINUSE':
logger.error(error.code + ':port is already in use.', 'serverOnErrorHandler', 10)
process.exit(1)
break
default:
logger.error(error.code + ':some unknown error occured', 'serverOnErrorHandler', 10)
throw error
}
} //end of On Error
function onListening() {
var addr = server.address()
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
('Listening on ' + bind)
logger.info('server listening on port' + addr.port, 'serverOnListeningHandler', 10)
let db = mongoose.connect(appConfig.db.uri, { useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true }) //end of onListening}
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason)
// application specific logging, throwing an error, or other logic here
})
// handling mongoose connection error
mongoose.connection.on('error', function (err) {
console.log('database connection error');
console.log(err)
}); // end mongoose connection error
// handling mongoose success event
mongoose.connection.on('open', function (err) {
if (err) {
console.log("database error");
console.log(err);
} else {
console.log("database connection open success");
}}); // end mongoose connection open handler
解决方案
尝试以 JSON 而不是 formdata 传递数据。
public contact() {
let param = {
'name': this.contactForm.get('formName').value,
'email': this.contactForm.get('formEmail').value,
'phone': this.contactForm.get('formPhone').value,
'message': this.contactForm.get('formMessage').value,
}
this.blogpostService.contactForm(param).subscribe(
data => {console.log(data)
this.toastr.successToastr('Your contact information is saved Susseccfully!', 'Success!');
setTimeout(() =>{
this.router.navigate(['/']);
}, 1000)
},
error => {
console.log(error);
console.log(error.errorMessage);
this.toastr.errorToastr('This is not good!', 'Oops!');
this.router.navigate(['/']);
})
}
推荐阅读
- html - Bootstrap CSS 覆盖我的自定义 CSS - 背景颜色/图像
- c++ - 用链表合并排序实现
- c++ - C++ 将字符数组转换为字符串数组
- javascript - 如何更改拖放项目的本地存储位置?
- networking - 网络 X:考虑网络指标中节点的权重,例如中介中心性
- python - 如何使用 Python 对 JSON 或文本进行排序
- sql - 如何在 Oracle SQL 中查找与字符串条件的一部分匹配但不匹配另一个条件的所有条目
- reactjs - 如何使用带有react-hook-form的yup验证模式跳过对fieldArray表单中最后一个对象的验证?
- python - 用 Python 写一个与 399、543 和 12345 相关的方程
- swashbuckle - 是否可以从 swashbuckle 文档中隐藏枚举值或名称描述?