добавление функций в модель knex / bookshelf в node / express - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть такая модель:

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 Ответ

0 голосов
/ 07 ноября 2018

Да, вы можете добавлять свои пользовательские функции к моделям книжных полок двумя различными способами.

  1. Методы экземпляра

Например, вы хотите вернуть полное имя пользователя, ваша модель пользователя будет выглядеть примерно так

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. Методы класса

Например, если вы хотите вернуть электронную почту пользователя на основе имени пользователя, ваша модель пользователя будет выглядеть примерно так

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);
    });
...