使用bodyparser,Node.js和sqlite3将网站上的表单数据插入数据库中的问题

问题描述

我是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等)。