问题描述
我是Node.js和sqlite的新手,现在我试图制作一个表单以从站点发送数据并将其传输到数据库,但是出现以下错误:
TypeError: Cannot read property 'ghostName' of undefined
at /home/user/server/index.js:23:29
at Layer.handle [as handle_request] (/home/user/server/node_modules/express/lib/router/layer.js:95:5)
at next (/home/user/server/node_modules/express/lib/router/route.js:137:13)
at /home/user/server/node_modules/body-parser/lib/read.js:130:5
at invokeCallback (/home/user/server/node_modules/raw-body/index.js:224:16)
at done (/home/user/server/node_modules/raw-body/index.js:213:7)
at IncomingMessage.onEnd (/home/user/server/node_modules/raw-body/index.js:273:7)
at IncomingMessage.emit (events.js:327:22)
at endReadableNT (_stream_readable.js:1220:12)
at processticksAndRejections (internal/process/task_queues.js:84:21)
这是代码本身:
index.js
const express = require('express');
const Parser = require('body-parser');
const { request } = require('express');
const sqlite3 = require('sqlite3').verbose();
const server = express();
let path_services = ( __dirname + '/public/static/img/services/' );
let path_html = ( __dirname + '/public/index.html' );
let path_font = ( __dirname + '/public/static/font/' );
let path_css = ( __dirname + '/public/static/css/' );
let path_img = ( __dirname + '/public/static/img/' );
let path_js = ( __dirname + '/public/static/js/' );
let path_db = ( __dirname + '/data.db' );
const Body_Parser = Parser.urlencoded({extended: false});
server.get('/',Body_Parser,function(req,res) {
res.sendFile(path_html);
});
server.post('/',res) {
let name = request.body.ghostName;
console.log(name);
let surname = request.body.ghostSurname;
let email = request.body.ghostemail;
let phone = request.body.ghostPhone;
let message = request.body.ghostMessage;
let db = new sqlite3.Database(path_db,sqlite3.OPEN_READWRITE,(err) => {
if(err) {
console.error(err.message);
}
console.log('Connected to Database!');
});
db.run('INSERT INTO client(name) VALUES(?)',[name,surname,email,phone,message],function(err) {
if(err) {
console.log(err.message);
}
console.log('Good!');
});
db.close();
});
server.use(express.static (path_services) );
server.use(express.static (path_font) );
server.use(express.static (path_css) );
server.use(express.static (path_img) );
server.use(express.static (path_js) );
server.listen(8000);
Html-from:
<form action="/" method="post">
<input type="text" name="ghostName" class="contacts__name">
<input type="text" name="ghostSurname" class="contacts__surname">
<input type="email" name="ghostemail" class="contacts__email">
<input type="text" name="ghostPhone" class="contacts__phone">
<input type="text" name="ghostMessage" class="contacts_message">
<input type="submit" value="" class="contacts_button">
</form>
如果有人解释错误的原因,我将不胜感激。现在,我试图理解sqlite,但是由于该错误,该过程进展缓慢。
解决方法
server.post('/',Body_Parser,function(req,res) { let name = request.body.ghostName;
您正在此处访问一个名为request
的变量(确实存在),但是您应该访问req
,它是与 request (“页面加载”)由用户当前正在处理。
request
是路由处理程序外部的变量,在您的示例中不会更改,并且不具有.body
属性,即使具有属性也不会包含表单值。
req
是函数的参数之一,它对于每个请求都是唯一的(就像res
一样),并且因为您添加了主体解析器,所以它包含一个.body
属性(除了常规的.query
,.header
等)。