我正在学习如何设置Express服务器,并且在创建新用户时遇到了一个奇怪的问题。 POST请求通过并没有出错,并带我到仪表板,但是当我在sqlite DB中查看时,它显示了注册表单中保存为undefined的所有值。我相信,我已经安装了body-parser并将其正确地调用到服务器中。
我尝试更改扩展名:true而不是false,并添加了res.setHeader('Content-Type','text / plain')到app.use中,如body-parser指南所述,但仍保存为未定义每次。
这是我的server.js代码
const app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.setHeader('Content-Type', 'text/plain');
next();
});
这是server.js中的POST代码
app.post('/register', function(req, res) {
bcrypt.hash(req.body.password, saltRounds, function(err, hash) {
let db = new sqlite3.Database("./database/InvoiceApp.db");
let sql = `INSERT INTO users(name, email, company_name, password) VALUES ('${req.body.name}','${req.body.email}','${req.body.company_name}','${hash}')`;
db.run(sql, function(err) {
if (err) {
throw err;
} else {
return res.json({
status: true,
message: "User Created"
});
}
});
db.close()
});
});
这是我的表单代码,我正在使用vue.js
register () {
const formData = new FormData()
let valid = this.validate()
if (valid) {
formData.append('name', this.model.name)
formData.append('email', this.model.email)
formData.append('company_name', this.model.company_name)
formData.append('password', this.model.password)
this.loading = "Registering you, please wait"
axios.post('http://localhost:3128/register', formData).then(res => {
this.loading = ''
if (res.data.status === true) {
this.$router.push ({
name: 'dashboard',
params: { user: res.data.user }
})
} else {
this.status = res.data.message
}
})
} else {
alert('Passwords do not match')
}
}
仅当我尝试以创建的用户身份登录或执行与创建的用户链接的其他操作时,创建新用户时不会收到任何错误消息。为什么我的表单在sqlite数据库中保存为未定义?
答案 0 :(得分:0)
您应该使用Vue应用程序中的JSON格式而不是FormData
。
FormData是随Content-Type application/x-www-form-urlencoded
传递的对象。
并且您的身体解析器已为Json配置。
请尝试更换
formData.append('name', this.model.name)
formData.append('email', this.model.email)
formData.append('company_name', this.model.company_name)
formData.append('password', this.model.password)
带有实际的JS对象 { “名称”:this.model.name .....其他领域..... }
并使用JSON.strinfigy(obj);传递此对象或该对象stringified
答案 1 :(得分:0)
花了一天的时间研究了FormData和JSON之后,我感谢this post和M U的回答才弄清楚了。因为我正在使用Vue.js,并且使用v-model将表单中的所有内容都存储了起来要做的就是将post方法更新为:
register () {
let valid = this.validate()
if (valid) {
this.loading = "Registering you, please wait"
axios.post('http://localhost:3128/register', this.model).then(res => {
this.loading = ''
if (res.data.status === true) {
this.$router.push ({
name: 'dashboard',
params: { user: res.data.user }
})
} else {
this.status = res.data.message
}
})
} else {
alert('Passwords do not match')
}
}
,然后将整个表单(带有哈希密码)上传到数据库