Mysql 无法读取属性';id';未定义的。快车
完整的代码如下-相当简单,我想添加,删除或更新帖子-当我自己做的事情之一,它的工作,但它一起打破 我在我用来查询数据库的数据库中搜索了很多Mysql 无法读取属性';id';未定义的。快车,mysql,node.js,Mysql,Node.js,完整的代码如下-相当简单,我想添加,删除或更新帖子-当我自己做的事情之一,它的工作,但它一起打破 我在我用来查询数据库的数据库中搜索了很多 var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', port : 3306, database: 'nodeproject', user : 'noderoot', password : 'default'
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
port : 3306,
database: 'nodeproject',
user : 'noderoot',
password : 'default'
});
var express = require('express');
var http = require('http');
var path = require('path');
var exphbs = require('express3-handlebars');
var qs = require('querystring');
var app = express();
app.set('port', process.env.PORT || 8000);
app.set('views', path.join(__dirname, 'views'));
app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
configQuery = function() {
connection.config.queryFormat = function (query, values) {
if (!values) return query;
return query.replace(/\:(\w+)/g, function (txt, key) {
if (values.hasOwnProperty(key)) {
return this.escape(values[key]);
}
return txt;
}.bind(this));
};
}
index = function(req, res){
/*connection.connect(function(err){
if(err != null) {
res.end('Error connecting to mysql:' + err+'\n');
}
});*/
connection.query("SELECT * FROM posts", function(err, rows){
if(err != null) {
res.end("Query error:" + err);
} else {
var myOuterRows = [];
for (var i = 0; i < rows.length; i++) {
var myRows = rows[i];
myOuterRows.push(myRows);
};
res.render('index', {
title: 'Express Handlebars Test',
posts: myOuterRows
});
}
});
};
addpost = function(req, res) {
var post = {
id: req.body.post.id,
postTitle: req.body.post.postTitle,
postContent: req.body.post.postContent,
published: req.body.post.published
};
connection.query('INSERT INTO posts SET ?', post, function(err, result) {
console.log("Neat! you entered a post");
});
res.redirect("/");
}
editpost = function(req, res) {
configQuery();
var edit = {
id: req.body.editpost.id,
postTitle: req.body.editpost.postTitle,
postContent: req.body.editpost.postContent
};
var queryTitle = connection.query("UPDATE posts SET ?", edit, function(err, result) {
console.log("Neat! you editted a post")
});
res.redirect("/");
}
deletepost = function(req, res) {
configQuery();
var deleteThis = {
id: req.body.deletepost.id
};
console.log(deleteThis);
var queryDelete = connection.query("DELETE FROM posts WHERE id = :id", {
id: deleteThis.id
});
res.redirect("/");
}
app.get('/', index);
app.post('/', addpost);
app.post('/', editpost);
app.post('/', deletepost);
//app.get('/list', list);
http.createServer(app).listen(8000, function(){
console.log('Express server listening on port ' + app.get('port'));
});
它应该去哪里
app.post('/', addpost);
app.post('/', editpost);
app.post('/', deletepost);
至addpost
或editpost
或deletepost
从您的代码中我可以看出,我建议您为每个处理程序保留不同的URL,这样您就可以知道要调用哪个处理程序,现在所有的post请求都会调用第一个处理程序,即addpost
像这样映射您的处理程序
app.post('/post/add', addpost);
app.post('/post/edit', editpost);
app.post('/post/delete', deletepost);
接下来在表单中,或者如果您正在使用ajax,请将您的
addrequest
发布到“/post/add”、editrequest
发布到/post/edit
等等。我读得不多,但我注意到一件事是,为什么要将一个url映射到多个处理程序?像/
类型的post
被映射到editpost
,deletepost
,addpost
你是否尝试过谷歌的节点调试,并在错误行上放置断点,看看有哪些对象,哪些对象应该在那里等,然后追溯出错误的地方?哦,每个url只使用一个app.VERB(),并在该函数中执行条件工作流。@pronox id遵循了如何在中执行post表单的示例node@Pengtuzi你没试过吗?有链接吗?@SimonPertersen我想说的是,只要我把它作为一个答案发布,检查一下这可能会有帮助,但是如果它们在同一个页面上,那又有什么关系呢?url的作用是什么?事实上,如果您正在编辑表单,请使用post handler将表单发布到url,让我更新我的答案,否则我会在每个表单元素中将表单操作设置为url?@SimonPertersen呈现您的视图并不重要,重要的是将处理程序保留在正确的位置。然后将请求发送到相应的处理程序,而不考虑view.Ty以获取帮助-清除一个简单的响应
app.post('/post/add', addpost);
app.post('/post/edit', editpost);
app.post('/post/delete', deletepost);