向 node/express 中的 knex/bookshelf 模型添加函数

adding functions to a knex/bookshelf model in node/express

我有这样一个模型:

const User = db.Model.extend({
    tableName: 'users',
    hasSecurePassword: true
});

module.exports = User;

有了这个我可以做一些事情

const User      = require("../models/user");

 User.fetchAll({columns:['id','email']}).then((data) => {
        res.json(data);
    }).catch(err => {
        res.json(err);
    });

如果我想为我的模型添加服装功能怎么办,例如:

var connection  = require('./dbconnection.js');
var User = db.Model.extend({
    tableName: 'users',
    hasSecurePassword: true
});


User.getUsers = (callback) => {
    if (connection) {
        const newLocal = "select * FROM users";
        connection.query(newLocal, (err,rows,fields) => {
            if (err) {
                return res.sendStatus(500);
            } else {
                callback(null,rows);
            }
        });
    }
};

module.exports = User;

然后做类似的事情:

 const User      = require("../models/user");
 User.getUsers((err,data) => {
    res.status(200).json(data);
});

这可能吗?还是只符合书架功能? 现在我得到的错误是 connection.query is not a function

而models/dbconnection.js是:

const mysql = require('mysql');
port = process.env.PORT || 3333;


if (port == 3333) {
    var connection = mysql.createConnection({
        host: process.env.DB_HOST,
        port: process.env.DB_PORT,
        user: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_NAME,
        insecureAuth: true
    });
} else {
    console.log("Error");
}

connection.connect();
module.exports.connection = connection;

是的,您可以通过两种不同的方式将自定义功能添加到书架模型中。

  1. 实例方法

例如,你想return用户的全名,你的用户模型看起来像这样

const User = db.Model.extend({
    tableName: 'users',
    hasSecurePassword: true,

    //be careful here, if you use arrow function `this` context will change 
    //and your function won't work as expected

    returnFullName: function() {
       return this.get('firstname') + this.get('lastname');
    }
});

module.exports = User;

那么你会像这样调用这个函数

User.forge().where({id: SOME_ID}).fetch()
    .then(function(user) {
        var fullName = user.returnFullName();
    });
  1. Class 方法

例如,你想return基于用户名的用户电子邮件,你的用户模型看起来像这样

const User = db.Model.extend({
    tableName: 'users',
    hasSecurePassword: true
}, {

    getUserEmail: function(SOME_USERNAME) {
        return User.forge().where({username: SOME_USERNAME}).fetch()
            .then(function (user) {
                if(user) {
                    return Promise.resolve(user.get('email'));
                } else {
                    return Promise.resolve(null);
                }
            });
    }        
});

module.exports = User;

然后你可以像

一样调用这个函数
User.getUserEmail(SOME_USERNAME)
    .then(function(email) {
        console.log(email);
    });