使用带有回调函数的module.exports导出对象

时间:2016-12-21 22:55:54

标签: javascript mysql node.js express

我正在尝试学习如何为nodejs编写自己的模块,特别是实现各种对象,然后我可以在整个应用程序中使用它。

我想使用这样的结果:

//assuming i have database:
Person_table(ID int A_I, NAME varchar, AGE int)
//code:
var p = new Person("John", 22);
p.writeToDatabase();
//the object is now written in database

我尝试了以下内容,但由于某些原因,我无法理解它不起作用。 我已经声明了三个文件:db.js,person.js,app.js

db.js

var mysql = require('mysql');
var conn = mysql.createPool({
    host : 'localhost',
    database: 'db_name',
    user: 'user_name',
    password : 'pass',
    multipleStatement: true,
    connectionLimit : 10
});

conn.getConnection(function(err){
    if(err) throw err;
});

module.exports = conn;

person.js

var db = require('./db.js');

function Person(n, a) {
    this.name = n;
    this.age = a;
}

Person.prototype.writeToDatabase = function (callback) {
    db.query("INSERT INTO Person_table(NAME, AGE) VALUES(?,?)", [this.name, this.age], function (err, rows) {
        if (err) return callback(err);
        else return callback(null, rows);
    });
}

module.exports = Person;

app.js

var Person = require('./person.js')

var p = new Person("John", 22);

p.writeToDatabase(function(err, rows){
    if(err) console.log(err);
    else console.log("written to DB");
});

我很感激有关代码错误的帮助。 作为奖励,我想问一下关于模块导出和对象原型主题的任何好文献,以创建分层nodejs应用程序。

2 个答案:

答案 0 :(得分:0)

我将给出的第一条建议如下:您可以在person.js中使用这样的回调:

Person.prototype.writeToDatabase = function (callback) {
    db.query("INSERT INTO Person_table(NAME, AGE) VALUES(?,?)",
      [this.name, this.age],
      callback // Since you do nothing with `err` or `rows`
    );
}

为什么?因为您处理了app.js文件中的回调:)。

接下来,我认为它不起作用,因为你不等待你的函数conn.getConnection结束,而且你不使用这个函数的返回!查看文档here

您应该重新组织代码,如:

<强> db.js

var mysql = require('mysql');

module.exports = mysql.createPool({
    host : 'localhost',
    database: 'db_name',
    user: 'user_name',
    password : 'pass',
    multipleStatement: true,
    connectionLimit : 10
});

<强> person.js

module.exports = function (connection) { // You need the connection to query your database.

    function Person(n, a) {
        this.name = n;
        this.age = a;
    }

    Person.prototype.writeToDatabase = function (callback) {
        // The connection is used here.
        connection.query("INSERT INTO Person_table(NAME, AGE) VALUES(?,?)",
            [this.name, this.age],
            callback
        );
    }

    return Person;
};

<强> app.js

var db = require('./db');

db.getConnection(function (err, connection) { // Once you're connected to the database, you can start using your app.

    var Person = require('./person')(connection); // Since we export a function with a parameter, we need to require the person.js like this.

    var p = new Person("John", 22);

    p.writeToDatabase(function(err, rows) {
        if(err) console.log(err);
        else console.log("written to DB");
    });
});

如果我不清楚,你可以要求更多细节:)。如果我向您展示的模式不符合您的期望,您可以通过其他方式完成工作;)

答案 1 :(得分:0)

我弄明白了这个问题。我的例子很完美,我只有一个完全不相关的问题。

在我的短程序结束时,我有process.exit(),以便我的应用程序在完成任务时结束。但是我没有考虑node.js的异步性质,所以我在写入数据库之前执行的process.exit()已经完成,因此失败了。

无论如何,感谢您的帮助!