簡體   English   中英

Node.js TypeError:無法讀取未定義的屬性“主機”

[英]Node.js TypeError: Cannot read property 'host' of undefined

我是一個 node.js 和 MySQL 初學者,我剛剛開始設置並嘗試一些基本代碼。當我按照本教程練習時,“ https://medium.com/@ekkodo/node-js-restful-web-api -%E7%AF%84%E4%BE%8B-for-mysql-d8be860594c1 ”, 終端顯示“TypeError: Cannot read property 'host' of undefined”錯誤,無法連接MySQL。
(程序中的“Product”是我數據庫中的一個表名)

This is the error displayed on my terminal

PS C:\Users\CJSCOPE\Desktop\nodetest\webapi> node app.js
C:\Users\CJSCOPE\Desktop\nodetest\webapi\node_modules\mysql\lib\ConnectionConfig.js:12
  this.host               = options.host || 'localhost';
                                    ^

TypeError: Cannot read property 'host' of undefined
    at new ConnectionConfig (C:\Users\CJSCOPE\Desktop\nodetest\webapi\node_modules\mysql\lib\ConnectionConfig.js:12:37)
    at Object.createConnection (C:\Users\CJSCOPE\Desktop\nodetest\webapi\node_modules\mysql\index.js:13:34)
    at Object.<anonymous> (C:\Users\CJSCOPE\Desktop\nodetest\webapi\models\product.js:4:24)
    at Module._compile (internal/modules/cjs/loader.js:1128:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
    at Module.load (internal/modules/cjs/loader.js:983:32)
    at Function.Module._load (internal/modules/cjs/loader.js:891:14)
    at Module.require (internal/modules/cjs/loader.js:1023:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (C:\Users\CJSCOPE\Desktop\nodetest\webapi\routes\product.js:2:15)

這是我的 node.js 代碼

app.js

var bodyparser = require('body-parser'); 
var express = require('express');

var config = require('./config');
var functions = require('./function');
var product =require('./routes/product');

var app=express();

req.body
app.use(bodyparser.urlencoded({ extended:false }));
app.use(bodyparser.json());

app.use(functions.passwordCrypto);
app.use('./product',product);

app.listen(config.port, function(){
    console.log('app listening on port'+ config.port + '!');
});

product.js(models)

var mysql =require('mysql');
var config =require('../config');

var connection = mysql.createConnection(config.db);
var sql = '';

module.exports = {
    item:function(req,callback){
        sql = 'SELECT * FROM product';
        return connection.query(sql,callback);
    },
    item:function(req,callback){
        sql = mysql.format('SELECT * FROM product WHERE id= ?',[req.params.id]);
        return connection.query(sql,callback);
    },
    add:function(req,callback){
        console.log('req.body',req.body);
        sql = mysql.format('INSERT INTO product SET ?',req.body);
        return connection.query(sql,callback);
    },
    delete:function(req,callback){
        sql = mysql.format('DELETE * FROM product WHERE id= ?',[req.params.id]);
        return connection.query(sql,callback);
    },
    put:function(req,callback){
        connection.beginTransaction(function(err){
            if(err) throw err;

            sql=mysql.format('DELETE * FROM product WHERE id= ?',[req.params.id]);

            connection.query(sql,function(err,results,fields){
                if(results.affectedRows){
                    req.body.id=req.params.id;
                    sql=mysql.format('INSERT INTO product SET ?',req.body);

                    connection.query(sql,function(err,results,fields){
                        if(err){
                            connection.rollback(function(){
                                callback(err, 400);
                            });
                        }else{
                            connection.commit(function(err){
                                if(err) callback(err,400);
                                callback(err,200);
                            });
                        }
                    });
                }else{
                    callback(err,410);
                }
            });
        });
    },

    patch:function(req,callback){
        sql = mysql.format('UPDATE product SET ? WHERE id = ? ',[req.body, req.params.id]);
        return connection.query(sql,callback);
    }
}

product.js(routes)

var express = require('express');
var product = require('../models/product');

var router=express.Router();

router.route('/')
    .get(function (req,res){
        product.items(req, function(err, results, fields){
            if(err){
                res.sendStatus(500);
                return console.error(err);
            }

            if(!results.length){
                res.sendStatus(404);
                return;
            }

            res.json(results);
        });
    })
    .post(function(req,res){
        product.add(req, function(err,results,fields){
            if(err){
                res.sendStatus(500);
                return console.error(err);
            }
            res.status(201).json(results.insertId);
        });
    });

    router.route('./id')
        .get(function(req,res){
            product.item(req,function(err,results,fields){
                if(err){
                    res.sendStatus(500);
                    return console.error(err);
                }

                if(!results.length){
                    res.sendStatus(404);
                    return;
                }

                res.json(results);
            });
        })
        .delete(function (req,res){
            product.delete(req,function(err,results,fields){
                if(err){
                    res.sendStatus(500);
                    return console.error(err);
                }

                if(!results.affectedRows){
                    res.sendStatus(410);
                    return;
                }

                res.sendStatus(204);
            });
        })
        .put(function(req,res){
            product.put(req,function(err,results){
                if(err){
                    res.sendStatus(500);
                    return console.error(err);
                }

                if(results === 410){
                    res.sendStatus(410);
                    return;
                }

                product.item(req,function(err,results,fields){
                    res.json(results);
                });
            });
        })
        .patch(function(req,res){
            product.patch(req,function(err,results){
                if(err){
                    res.sendStatus(500);
                    return console.error(err);
                }

                if(!results.affectedRows){
                    res.sendStatus(410);
                    return;
                }

                req.body.id=req.params.id;
                res.json([req.body]);
            });
        });
module.exports = router;

function.js

var crypto = require('crypto'); 
var config = require('./config');

module.exports = {
    passwordCrypto: function(req,res,next){
        if(req.body.password){
            req.body.password=crypto.createHash('md5')
                            .update(req.body.password+config.salt)
                            .digest('hex');
        }
        next();
    }
};

config.js

module.export = {
    db:{
        host:'127.0.0.1',
        user:'root',
        password:'1234',
        database:'shop',
        port:3306
    },
    port:3300
}       

這是您需要通過傳遞所有必需的嬰兒車為 mysql 創建連接對象的方式,示例:

    var config =require('../config');
    const connection = mysql.createConnection({
      host: config.db.host,
      user: config.db.user,
      password: config.db.password,
      database: config.db.database
    });

確保路徑var config =require('../config'); 是正確的,您可以通過將其懸停來閱讀該文件。

也改變module.export = {module.exports = {config.js文件

我認為問題是你在config.js有一個錯字。 您正在使用module.export而不是module.exports ,因此您不會導出任何內容,並且當您在product.js使用require()時,您會得到一個空對象,因此config.dbundefined

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM